[英]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.