来自某个地方的额外换行

时间:2014-08-12 10:07:00

标签: awk gawk

有人可以解释我做错了什么以及如何做得更好。

我有一个包含字段分隔符“ - ”和记录分隔符“\ 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

最后一条记录后面紧跟一个换行符,一个标签和最后一个数字。发生了什么事?

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