Linux 为什么awk打印两行? $cat ff ./res/values/strings.xml:1293:Sub1编号: ./res/values/strings.xml:1302:XDivert仅为第一次订阅设置 ./res/values/strings.xml:1870:Subscription 1: ./res/values/strings.xml:1860:SUB 1 对于$中的f(cat ff | awk-f:“{print$1”+“$2}”);不要重复$f;完成 ./res/values/strings.xml +1293 ./res/values/strings.xml +1302 ./res/values/strings.xml +1870 ./res/values/strings.xml +1860

Linux 为什么awk打印两行? $cat ff ./res/values/strings.xml:1293:Sub1编号: ./res/values/strings.xml:1302:XDivert仅为第一次订阅设置 ./res/values/strings.xml:1870:Subscription 1: ./res/values/strings.xml:1860:SUB 1 对于$中的f(cat ff | awk-f:“{print$1”+“$2}”);不要重复$f;完成 ./res/values/strings.xml +1293 ./res/values/strings.xml +1302 ./res/values/strings.xml +1870 ./res/values/strings.xml +1860,linux,awk,Linux,Awk,我想在一行中打印$1和$2,格式为$1+$2,但它在上面打印,有什么问题吗?您不需要for包装器包装awk命令 如果只运行awk命令,您将获得所需的输出: $ cat ff ./res/values/strings.xml:1293: <string name="sub1LineNumber">Sub1 Number :</string> ./res/values/strings.xml:1302: <string name="xdivert_parti

我想在一行中打印$1和$2,格式为$1+$2,但它在上面打印,有什么问题吗?

您不需要
for
包装器包装
awk
命令

如果只运行
awk
命令,您将获得所需的输出:

$ 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

发生的情况是,
$(…)
包装器和
for
循环导致
awk
输出中的每个空格分隔的单词成为循环的单独输入。移除循环并移除问题。

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

您也不需要使用
cat
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
对于更一般的循环体,最好避开空间:

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

for
的delimeter是任意空间,因此awk输出中的空间将被视为单独的值

代替for循环,您可以在read构造时使用
一次读取输出行。比如说,

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

@你应该把它作为答案贴出来。不需要
cat
把文件放到
awk
。正确的语法:
awk-F:'{print$1“+”$2}'ff
足够正确,因此不需要它(但它是否是首选样式也有争议;我将不讨论堆栈溢出)。在这种情况下,我的目标只是尽量少地编辑原稿。
awk -F : '{print $1 " +" $2}' ff | while read f; do
  echo "$f"
done