2013-06-01 37 views
2

我有多个列的制表符分隔的文件。 我需要检查,如果特定列包含有效的值。 例如第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 
+0

你为什么要运行'ps' ?你只是想运行'grep check.txt | wc -l' – Barmar

+0

P.S.请使用SO的'{}'工具格式化你的代码,不要对其进行格式化为HTML。 – Barmar

+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。这意味着你允许文件有一个无效行;你只报告failed如果至少有2条线不符合标准的13列如果实际上应该是没有这样的线路,更改为:

if [ -s check.txt ]; 

此测试,如果文件中有非零长度。

+0

感谢这项工作,我的文件包含标题,因此-gt 1 –

+0

如果有效,您应该接受答案。 – Barmar

0

你没有说你的问题是什么,所以我不知道如果这个回答是与否,但最强大的,可扩展的方式来检查场($ 13)是一组有效值的成员(1,2,3,或97)在AWK是简单地编写它你描述的方式,如:

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 
相关问题