检查列是否包含有效值

时间:2013-06-01 06:15:47

标签: bash awk grep

我有一个包含多个列的制表符分隔文件。 我需要检查特定列是否包含有效值。 例如第13列应该只有值1,2,3,97

awk -F"\t" '{ if ($13!=1&&$13!=2&&$13!=3&&$13!=97) print $0}' test-data.txt > check.txt
if [ $( ps -ef | grep check.txt | wc -l ) -gt "1" ];
then
    upload_ok="no"
    echo "failed"
else
    echo "pass"
fi

2 个答案:

答案 0 :(得分:0)

if [ $( ps -ef | grep check.txt | wc -l ) -gt "1" ];

应该是:

if [ $( wc -l < check.txt ) -gt "1" ];

使用ps -ef毫无意义,这是用于检查正在运行的进程,这与您的应用程序无关。而且您不需要grep,因为您没有在文件中搜索任何内容 - 您只想知道它有多少行,这是wc -l返回的内容。

我对-gt 1有点不确定。这意味着您允许该文件具有一个无效行;如果至少有2行不符合第13列的条件,则只报告failed。如果实际上没有这样的行,请更改为:

if [ -s check.txt ];

这将测试文件的长度是否为非零。

答案 1 :(得分:0)

你没有说出你的问题是什么,所以我不知道这是否有答案,但是最强大,可扩展的方法来检查作为一组有效值的成员的字段($ 13)( awk中的1,2,3或97)只是按照你描述它的方式对其进行编码,例如:

awk -F'\t' '
BEGIN{ split("1,2,3,97",tmp,/,/); for (i in tmp) valid[tmp[i]] }
!($13 in valid)
' test-data.txt

而不是:

awk -F"\t" '{ if ($13!=1&&$13!=2&&$13!=3&&$13!=97) print $0}' test-data.txt