测试文本文件的最后一列标题是否相等

时间:2019-02-28 14:09:48

标签: bash

我正在尝试检查名为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

因此,尽管最后一列似乎已正确命名,但测试失败。如果我仅测试前两列的名称,那么它可以工作,但是对于最后一列的测试总是以某种方式被认为是错误的。

如何纠正脚本,以便它也可以正确测试最后一列标题的值?

2 个答案:

答案 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

还是不。