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,但它打印在上面,怎么了?

4

3 回答 3

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输出中的每个空格分隔的单词成为循环的单独输入。删除循环,并消除问题。

于 2013-11-05T02:04:35.780 回答
1

awk不打印两行;你echo打印了两行,因为文件名和行号之间有一个空格,所以for循环将文件名视为一个值f,然后将行号视为第二个值,依此类推。

您也不需要使用cat; awk也可以读取文件。

对于显示的循环体,您可以编写:

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

对于更通用的循环体,最好避开空格:

for f in $(awk '{print $1 "+" $2 }' ff)
do
    ...whatever...
done
于 2013-11-05T02:09:16.530 回答
1

分隔符为for任何空格,因此 awk 输出中的空格将被视为单独的值。

while read您可以使用构造一次读取输出行,而不是 for 循环。例如,

awk -F : '{print $1 " +" $2}' ff | while read f; do
  echo "$f"
done
于 2013-11-05T02:11:54.893 回答