【发布时间】:2018-10-03 01:20:21
【问题描述】:
我有以下 shell 脚本将标题行附加到一批 .csv 文件。我需要根据输入 csv 中的列数对每个 .csv 应用不同的标头 txt 文件。该脚本正在工作,因为它正在应用头文件并输出新的 csv,但每个文件都获取“else”头 - 包括使用csvgrep -n $f | wc -l 命令评估为“91”的 csv。
#!/bin/sh
dir="/Users/XXX/xlsxtocsv"
#move to the csvraw output directory
cd csvraw/
#append the header row needed for DB import
for f in *.csv; do
if [[ "csvgrep -n $f | wc -l" == 91 ]]; then
cat $dir/svcheader3col.txt $f >> "$dir/csvhead/${f%}header.csv"
else
cat $dir/svcheader.txt $f >> "$dir/csvhead/${f%}header.csv"
fi
done
当我在 csv 文件上手动运行 csvgrep 命令时,我得到:
username:csvraw username$ csvgrep -n file4col.csv | wc -l
92
username:csvraw username$ csvgrep -n file3col.csv | wc -l
91
为什么“file3col.csv”文件在 if 语句中没有计算为 91,而是当我手动运行它时?
【问题讨论】:
-
比较的是字符串
csvgrep -n $f | wc -l,而不是命令csvgrep -n $f | wc -l的输出。 -
顺便说一句,考虑使用
bash -x yourscript来运行一个脚本,记录它调用的每个命令——如果你真的看到测试在实践中做了什么,这使得这种问题更容易调试。 -
我不知道有很大帮助的“bash -x”。
标签: shell csv for-loop if-statement