我怎样才能让 awk 忽略数据中的换行符?
How can I get awk to ignore newlines in data?
我经常需要处理杂乱的文本数据,我需要将这些数据分成多个字段。
我有使用退格键(十进制 008)作为字段分隔符和删除(十进制 127)作为记录分隔符的良好经验,因为它们从未出现在键入的文件中。
我可以获得一个程序来按我想要的方式拆分所有内容,但我也想使用 awk。它接受 RS=<delete>
但它也会打破我不想要的换行记录。
显然,我可以用某种顺序替换换行符并将其翻转回来,但是有没有更巧妙的方法来做到这一点?
如果您根据需要设置 RS 和 FS,我认为这会像您期望的那样工作。
鉴于:
$ echo -n $'a\bb\bc7c\bd' | od -c
0000000 a \b b \b c 177 c \b d
0000011
您可以这样使用gawk
:
$ echo -n $'a\bb\bc7c\bd' | awk -v FS=$'\b' -v RS=$'7' '{ print NR, NF, , , }'
1 3 a b c
2 2 c d
显然 \b
会导致 [=14=]
的打印无法正确显示,但记录数、字段数和各个字段都符合预期。
注意 $'[string or character]'
的 Bashism 设置测试字符串以创建单个字符 RS
和 FS
awk 变量。
我经常需要处理杂乱的文本数据,我需要将这些数据分成多个字段。
我有使用退格键(十进制 008)作为字段分隔符和删除(十进制 127)作为记录分隔符的良好经验,因为它们从未出现在键入的文件中。
我可以获得一个程序来按我想要的方式拆分所有内容,但我也想使用 awk。它接受 RS=<delete>
但它也会打破我不想要的换行记录。
显然,我可以用某种顺序替换换行符并将其翻转回来,但是有没有更巧妙的方法来做到这一点?
如果您根据需要设置 RS 和 FS,我认为这会像您期望的那样工作。
鉴于:
$ echo -n $'a\bb\bc7c\bd' | od -c
0000000 a \b b \b c 177 c \b d
0000011
您可以这样使用gawk
:
$ echo -n $'a\bb\bc7c\bd' | awk -v FS=$'\b' -v RS=$'7' '{ print NR, NF, , , }'
1 3 a b c
2 2 c d
显然 \b
会导致 [=14=]
的打印无法正确显示,但记录数、字段数和各个字段都符合预期。
注意 $'[string or character]'
的 Bashism 设置测试字符串以创建单个字符 RS
和 FS
awk 变量。