$ 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美元,但它打印在上面,出了什么问题?
答案 0 :(得分:7)
for
命令周围不需要awk
包装器。
如果您只是运行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
输出中每个以空格分隔的单词成为循环的单独输入。删除循环,并删除问题。
答案 1 :(得分:1)
awk
不会打印两行;您的echo
打印两行,因为文件名和行号之间有一个空格,因此for
循环将文件名视为f
的一个值,然后将行号视为第二个值,依此类推。
您也不需要使用cat
; awk
也可以读取文件。
对于显示的循环体,您可以写:
awk '{print $1 " +" $2}' ff
对于更通用的循环体,最好避开空间:
for f in $(awk '{print $1 "+" $2 }' ff)
do
...whatever...
done
答案 2 :(得分:1)
for
的分隔符是任何空格,因此awk输出中的空格将被视为单独的值。
您可以使用while read
构造一次读取输出行,而不是for循环。例如,
awk -F : '{print $1 " +" $2}' ff | while read f; do
echo "$f"
done