【问题标题】:String concatenation in awkawk中的字符串连接
【发布时间】:2013-08-06 13:21:15
【问题描述】:

考虑以下文本文件 (test.txt):

1 1 1
7 7 6

和 awk 脚本 (test.awk)

{
    print "$0 : ", $0
    lines=(lines $0)
    print "lines : ", lines
}

然后运行:

awk -f test.awk test.txt

给出输出

$0 :  1 1 1
lines :  1 1 1
$0 :  7 7 6
7 7 6 :  1 1 1

虽然预期的输出应该(据我所知)是:

$0 :  1 1 1
lines :  1 1 1
$0 :  7 7 6
lines : 1 1 17 7 6

我在这里错过了什么?

(我在 Ubuntu 12.04 上使用 GNU Awk 3.1.8)

【问题讨论】:

  • 以上在 Arch Linux 上按预期工作。将 test.awk 文件中的 lines=(lines $0) 行更改为 lines=(lines $0 " ") 以在行之间添加一个空格,否则工作时的最终结果是 lines : 1 1 17 7 6
  • 顺便说一句,我正在使用 awk 版本 4.1.0
  • 谢谢cmets..那么,既然它对你有用,我猜我的配置一定有问题?
  • 不客气;我不知道,我猜...我认为我根本没有配置awk。您可以尝试使用-F "\n" 将分隔符指定为\n,但我认为最好的办法是检查更新,如果仍然没有帮助,请检查您的配置。
  • 如果您有awk的自定义配置,请将其添加到您的帖子中。

标签: awk concatenation


【解决方案1】:

您的 DOS 行结尾为 test.txt(CRLF,或每行末尾的 \r\n)。

带有 Unix 行尾的输出:

$0 :  1 1 1
lines :  1 1 1
$0 :  7 7 6
lines :  1 1 17 7 6

以 DOS 行结尾的输出:

$0 :  1 1 1
lines :  1 1 1
$0 :  7 7 6
7 7 6 :  1 1 1

使用十六进制转储程序格式化的 DOS 行结尾输出:

0x0000: 24 30 20 3A 20 20 31 20 31 20 31 0D 0A 6C 69 6E   $0 :  1 1 1..lin
0x0010: 65 73 20 3A 20 20 31 20 31 20 31 0D 0A 24 30 20   es :  1 1 1..$0 
0x0020: 3A 20 20 37 20 37 20 36 0D 0A 6C 69 6E 65 73 20   :  7 7 6..lines 
0x0030: 3A 20 20 31 20 31 20 31 0D 37 20 37 20 36 0D 0A   :  1 1 1.7 7 6..
0x0040:

0D 代码是 CR 行结尾。

【讨论】:

  • 是(sub("\r","") 可以工作),或者在 Unix 系统上使用 Unix 文件,如有必要,使用 FTP 以文本模式传输文件,或者使用 dos2unix 或等效的将文件从 DOS 转换为Unix。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-27
  • 2019-10-17
  • 1970-01-01
  • 1970-01-01
  • 2020-01-13
  • 1970-01-01
相关资源
最近更新 更多