在 awk print 语句中重复输入有什么问题?

What's wrong with repeating entries in awk print statements?

我试图回答 this other question 关于如何重复现有专栏的问题。

我认为这很简单,只需执行以下操作即可:

awk '{print [=10=] }'

然而,这似乎只打印 [=13=]

所以,我决定再做一些测试:

awk '{print [=11=] [=11=]}'     // prints the entire line only once
awk '{print   }'  // prints the first entry only once
awk '{print   [=11=]}'  // prints the first entry, followed
                        // by the entire line
                        // (the second part is not printed)
...

看看结果,我的印象是 awk 或多或少在检查他已经打印的内容并拒绝下次打印。

这是为什么?

我正在为 Linux (WSL) 使用 Windows 子系统中的 awk,更准确地说是来自 Canonical 的 Ubuntu 应用程序。这是 awk --version:

的结果
GNU Awk 5.0.1, API: 2.0 (GNU MPFR 4.0.2, GNU MP 6.2.0)
Copyright (C) 1989, 1991-2019 Free Software Foundation.
awk '{print [=10=] [=10=]}'     // prints the entire line only once

awk '{print [=10=] }'     // prints only [=10=]

所有这些都是由于您的文件中存在 DOS 换行符 \r。由于 \r unix 输出从行位置的开头覆盖在同一行上,因此两行重叠,您只能在输出中看到一行。

您可以使用 trsed 删除 \r,如下所示:

tr -d '\t' < file > file.new
sed -i.bak $'s/\r$//' file

或者您可以要求 awk\r\n 视为记录分隔符(注意 gnu-awk)

awk -v RS='\r\n` '{print [=12=], [=12=]}' file