2013-11-05 142 views
0
$ cat ff 
./res/values/strings.xml:1293: <string name="sub1LineNumber">Sub1 Number :</string> 
./res/values/strings.xml:1302: <string name="xdivert_partial_set">XDivert has been set only for 1st subscription</string> 
./res/values/strings.xml:1870: <string name="set_sub_1">Subscription 1: </string> 
./res/values/strings.xml:1860: <string name="sub_1">SUB 1</string> 

for f in $(cat ff |awk -F : '{print $1" +" $2}'); do echo $f; done 
./res/values/strings.xml 
+1293 
./res/values/strings.xml 
+1302 
./res/values/strings.xml 
+1870 
./res/values/strings.xml 
+1860 

我想以$ 1 + $ 2的格式在一行中打印$ 1和$ 2,但打印在上面,出了什麼問題?爲什麼在兩行中打印awk?

回答

7

您不需要圍繞awk命令的for包裝。

如果只是運行awk命令,你會得到輸出你想要的:

$ cat ff | awk -F : '{print $1 " +" $2}' 
./res/values/strings.xml +1293 
./res/values/strings.xml +1302 
./res/values/strings.xml +1870 
./res/values/strings.xml +1860 

發生了什麼事是,$(...)包裝和for循環是造成你awk輸出之間用空格分開字成爲循環的單獨輸入。刪除循環,並刪除問題。

+0

@Dan您應該將其作爲答案發布。 – Barmar

+1

不需要將文件'cat'到'awk'。正確的語法:'awk -F:'{print $ 1「+」$ 2}'ff' – Jotne

+0

真的夠了,它不是必需的(但是它是否是首選的樣式也是有爭議的;我將討論這個不是堆棧溢出)。在這種情況下,我只是爲了最小化地編輯原文。 – danfuzz

1

awk不打印兩行;您的echo將打印兩行,因爲文件名和行號之間有空格,因此for循環將文件名視爲f的一個值,然後將行號視爲第二個值,依此類推。

你也不需要使用cat; awk也可以讀取文件。

對於所示循環體,你可以寫:

awk '{print $1 " +" $2}' ff 

對於一個更一般的循環體,你最好避免空間:

for f in $(awk '{print $1 "+" $2 }' ff) 
do 
    ...whatever... 
done 
1

for的分隔符是任何空間,所以awk輸出中的空間將被視爲一個單獨的值。

代替for循環,您可以使用while read構造一次讀取輸出行。例如,

awk -F : '{print $1 " +" $2}' ff | while read f; do 
    echo "$f" 
done