2013-11-22 56 views
1

假設我有一個文件info.txt。第一列是id,剩下的就是它的內容。迭代Shell中的grep返回的行

1 aaa bbb 
1 ccc ddd mmm 
4 ccc eee 
7 ddd fff jjj kkk 

我只有和以「1」開頭的行相關的問題。所以我用grep對其進行過濾:

what_I_concern=$(cat info.txt | grep -iw 1 | cut -d ' ' -f 2-) 

,然後我想通過這些行迭代:

for i in $what_I_concern; do 
    pass $i to another program #I want to pass one line at a time 
done 

但它確實是通過這些線的每一個字迭代,而不是採取每一行作爲一個整體。

我該如何解決這個問題?

+0

你照顧有關* *後的數量,所以你不能遍歷*每一個*字,但*每第二*,對嗎?換一種說法,您希望的輸入格式是什麼? – Rajish

回答

2

你試圖完成你需要的方式是造成分詞。相反,說:

while read -r line; do 
    someprogram $(cut -d' ' -f2- <<< "$line") 
done < <(grep '^1' info.txt) 

<()語法被稱爲Process Substitution。在這種情況下,它使while循環能夠將grep命令的輸出作爲文件讀取。

+0

您可以在grep之前解釋'<'嗎? – duleshi

1

你能避免使用grepcut完全在此情況下(假設默認IFS

while read -r first rest; do 
    [ "$first" = "1" ] && pass "$rest" to another program; 
done < info.txt