2013-06-01 71 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 
相關問題