簡體   English   中英

Bash - 使用循環打印具有特定列的所有行

[英]Bash - Print all rows with a specific column using loops

我已經堅持這個問題幾個小時,所以我決定問這個社區。

我有一個這樣的日志文件:

gzz kre 1
mnt ttt 1
ddr ppp 2
ret typ 2
epo sst 1
plt ewr 3

我想將這個文件分成三個不同的文件,每個文件在第三列中具有相同的值。

我可以使用awk靜態地執行此操作:

awk '$3 == 1'  dataTX.txt > dataTX_2_$i.txt

不過,我不能用循環來做到這一點。 我正在嘗試這個:

for i in `seq 1 3`;
do
    awk '$3 == $i'  dataTX.txt > dataTX_2_$i.txt

done

但三個輸出文件中沒有任何內容。

誰能幫我?

非常感謝 :-)

你可以用單個awk中的所有內容:

awk '{print > ("dataTX_2_" $3 ".txt")}' dataTX.txt

有一個更好的答案,請參閱@ anubhava's。

途徑

你的方法(以及我原來的答案,下面)有幾個問題:

  • 多次讀取輸入文件而不是一次
  • 硬編碼值而不是從輸入動態拾取

@ anubhava的解決方案通過在單個awk進程中重定向輸出,對輸入進行單次傳遞,並動態獲取用於輸出文件名的值來處理這些問題。 作為額外的獎勵,沒有必要的條件。

原始答案,樂隊幫助錯誤的方法

你需要使用雙引號來嵌入一個shell變量,然后在這種情況下轉義\\$ in $3 ,如下所示:

for i in `seq 1 3`;
do
    awk "\$3 == $i"  dataTX.txt > dataTX_2_$i.txt    
done

順便說一句,如果可能的話,避免使用seq 這也可以做到這一點,並且更加便攜:

for i in {1..3};
do
    awk "\$3 == $i"  dataTX.txt > dataTX_2_$i.txt    
done

另一種選擇是使用-v標志將值注入到Awk變量中,而不是搞亂引用:

for i in {1..3};
do
    awk -v i=$i '$3 == i'  dataTX.txt > dataTX_2_$i.txt    
done

暫無
暫無

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

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