有人可以解释我做错了什么以及如何做得更好。
我有一个包含字段分隔符“ - ”和记录分隔符“\ t”(制表符)的记录的文件。我想将每条记录放在一行,然后是行号,用制表符分隔。输入文件名为foo.txt
。
$ cat foo.txt
a-b-c e-f-g x-y-z
$ < foo.txt tr -cd "\t" | wc -c
2
$ wc foo.txt
1 3 18 foo.txt
我的awk脚本位于文件foo.awk
BEGIN { RS = "\t" ; FS = "-" ; OFS = "\t" }
{
print $1 "-" $2 "-" $3, NR
}
以下是我运行时的结果:
$ gawk -f foo.awk foo.txt
a-b-c 1
e-f-g 2
x-y-z
3
最后一条记录后面紧跟一个换行符,一个标签和最后一个数字。发生了什么事?
答案 0 :(得分:1)
数据末尾有换行符,打印$3
时也会输出。
特别是,它看起来像这样:
$1 = "x"
$2 = "y"
$3 = "z\n"
在将所有内容传递给tr
之前,您可以使用awk
删除尾随分隔符:
tr -d '\n' < foo.txt | awk -f foo.awk
或者将\n
添加到字段分隔符列表中(如Kent的答案中所示),因为awk
将从字段中删除任何分隔符。
答案 1 :(得分:1)
我确切地知道你确切的目标,但是因为你用awk构建了这个东西,你可以将\n
添加到FS
以达到你的目标,即删除尾随{{1}并且无需启动其他流程,例如\n
tr, sed or awk
答案 2 :(得分:0)
awk 'BEGIN { RS = "\t"; FS = OFS = "-" } { sub(/\n/, ""); print $0 "\t" NR }' file
输出:
a-b-c 1
e-f-g 2
x-y-z 3
ORS = "\n"
没有必要。使用GNU Awk或Mawk,你可以拥有RS = "[\t\n]+"
:
awk 'BEGIN { RS = "[\t\n]+"; FS = OFS = "-" } { print $0 "\t" NR }' file