2017-08-11 257 views
0

我將不勝感激您對以下方面的幫助。awk命令的bash腳本

我有以下文件(file.txt的),這是約10,000線長:

ID1 ID2 0 1 0.5 0.6 
ID3 ID4 0 0 0.4 0.8 
ID1 ID5 0 1 0.5 0.3 
ID6 ID2 1 0 0.4 0.8 

在第一兩列中的ID可以在文件中爲1〜10倍之間發生(在任一列中1或第2欄)。

我想達到的目標:

我想,如果他們符合以下條件的掃描一行此文件中的行,並打印ID,以不斷增長的排除列表:

我的標準是如下:

If $3 > $4, print $2 (ID2) to exclusionlist.txt 
If $3 < $4, print $1 (ID1) to exclusionlist.txt 
If $3 = $4 and $5 < $6, print $2 (ID2) to exclusionlist.txt 
If $3 = $4 and $5 > $6, print $1 (ID1) to exclusionlist.txt 

所以將其應用到第1行,無論是ID1應該是我exclusionlist,因爲$ 3 < $ 4

然後我想刪除文件中的全部行,其中排除列表中的ID出現。 (這可以最多10行)。

輸出file.txt的一次第1行已掃描應該是這樣的:

ID3 ID4 0 0 0.4 0.8 
ID6 ID2 1 0 0.4 0.8 

而且exclusionlist.txt: ID1

然後我想在新行1再次啓動(因爲原定的行1將被定義刪除),並執行相同的過程,但不斷將新排第1行的排除添加到同一個排除列表中。

這是試過的。這意味着不必對file.txt文件1.txt的

#! bin/bash 
for i in {1..5000} 
do 
awk 'NR==1{print;}' $i.txt 
awk '{if ($3>$4 || $3==$4 && $5<$6) print $2;}' $i.txt >  exclusionlist_$i.txt 
awk '{if ($3>$4 || $3==$4 && $5>$6) print $1;}' $i.txt >> exclusionlist_$i.txt 
grep -v -f exclusionlist_$i.txt $i.txt > $((i+1)).txt 
rm $i.txt 
done 

重命名由於我可憐的腳本編寫技能,我有:(1)每一個循環之後重命名我的文件,以便它被連續地執行,和(2)每個循環結束一個新的排除列表,而不是一個單獨的「主」排除列表 - 我可以很容易地將它們連接在一起,所以這不是一個主要問題,但是很麻煩。

我遇到的問題是,此命令似乎掃描整個文件(而不是第1行),從第一次運行創建一個長排除列表。

任何幫助/建議將不勝感激。

謝謝。

GB

+0

根據您的標準,唯一應該留下的線是'$ 3 == $ 4 && $ 5 == $ 6'的位置 –

+0

@ GB44444讀取解決方案後應該怎麼做https://meta.stackexchange.com/questions/5234/how-do-accepting-an-answer-work –

回答

1

我不明白爲什麼你需要在多個步驟中做到這一點。最後,所有的行將被刪除,你只會得到排除列表。

例如,這將做同樣一通

$ awk '!($1 in exc) && !($2 in exc){f=($3>$4 || $3==$4 && $5<$6)?2:1; 
            print $f > "exclusion.list"; exc[$f]}' file 

$ cat exclusion.list 
ID1 
ID4 
ID2 

,因爲唯一的結局就是排除列表,您可以打印到stdout

$ awk '!($1 in exc) && !($2 in exc){f=($3>$4 || $3==$4 && $5<$6)?2:1; 
            print $f; exc[$f]}' file > exclusion.list   

並重定向到一個文件中。

或者,也許我誤解了這個問題。還請注意,$3==$4 && $5==$6條件未在您的規範中定義。也許這就是你所追求的!如果是這樣,請在此關鍵情況下創建樣本數據並指出需要發生的情況。

+0

這似乎很好。非常感謝你! (N.B. $ 3 == $ 4 && $ 5 == $ 6不會在文件中出現)。 – GB44444