簡體   English   中英

AWK命令的Bash腳本

[英]Bash script for awk command

感謝您在以下方面的幫助。

我有以下文件(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行,考慮到$ 3 <$ 4,ID1應該在我的排除列表中。

然后,我想從排除列表中刪除該ID出現的文件中的所有行。 (最多可以有10行)。

掃描完第1行后,file.txt的輸出應如下所示:

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)最后在每個循環中都有一個新的排除列表,而不是單個'master排除列表-我可以在最后輕松地將它們全部連接起來,因此這不是主要問題,而是一團糟。

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

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

謝謝。

GB

我不明白為什么您需要分多個步驟來執行此操作。 最終,所有行將被刪除,您將只獲得排除列表。

例如,這將一次完成相同的操作

$ 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

由於唯一的結果是排除列表,因此您可以將其打印到標准輸出

$ 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條件。 也許那就是你所追求的? 如果是這樣,請在這種嚴重情況下創建樣本數據並指出需要發生的情況。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM