我正在尝试检查名为testfile.txt
的用户文件的列是否正确命名(它们应命名为var1,var2,var3)。该文件看起来像
var1 var2 var3
5 6 7
我认为以下方法应该有效:
read i j k < testfile.txt
echo "${k}"
if [[ "${i}" != "var1" || "${j}" != "var2" || "${k}" != "var3" ]]; then
echo "input incorrect"
else
echo "input correct"
fi
但这会返回
var3
input incorrect
因此,尽管最后一列似乎已正确命名,但测试失败。如果我仅测试前两列的名称,那么它可以工作,但是对于最后一列的测试总是以某种方式被认为是错误的。
如何纠正脚本,以便它也可以正确测试最后一列标题的值?
答案 0 :(得分:1)
如果您只想从标题行中删除CR:
read i j k <<< $( sed '1 s/\r//g; 2q;' testfile.txt )
如果要清除整个文件:
tr -d "\r" <testfile.txt>x && mv x testfile.txt
答案 1 :(得分:0)
GNU awk中的一个(或任何支持multichar RS
的awk,例如mawk或Busybox awk):
$ awk 'BEGIN {
RS="\r?\n" # regard \r
headers="var1, var2, var3" # header names
n=split(headers,h,/, */) # set to an array
}
NR==1 { # only process first record
for(i=1;i<=NF;i++) # and every field of it
if($i!=h[i] || n!=NF) { # if a header differ of count is wrong
print "input incorrect" # complain
exit # and leave
}
exit # leave without complaining
}' testfile
输出可能是:
input incorrect
还是不。