【问题标题】:How can I get awk to ignore newlines in data?如何让 awk 忽略数据中的换行符?
【发布时间】:2017-05-03 16:58:49
【问题描述】:

我经常需要处理需要拆分成字段的杂乱文本数据。

我在使用退格(十进制 008)作为字段分隔符和删除(十进制 127)作为记录分隔符方面有很好的经验,因为它们从未出现在键入的文件中。

我可以得到一个程序来按我想要的方式拆分所有内容,但我也想使用 awk。它接受RS=<delete>,但它也打破了我不想要的换行记录。

显然,我可以用某种序列替换换行符并将其翻转回来,但是有没有更巧妙的方法来做到这一点?

【问题讨论】:

  • 请添加示例输入和所需结果。太多工作无法猜测。
  • 不要回答不懂的问题。我使用退格和删除字符作为分隔符,因为它们不会出现在手动输入的数据文件中。对于简单的测试,请尝试以下操作: cat > test abc def ghi 这将创建三个记录,每个记录有 3 个字段——最后一个字段应该包含一个换行符。但是,如果您尝试 awk '{FS="\010"}{RS="\177"}{OFS=" "}{ORS="\n"}{print NR"--"NF"--"$0} ' 测试我保证这不是你会看到的。
  • @jas,如果设置为大多数普通字符,awk 不会换行。但这不正常。我建议在告诉人们他们所观察到的事情没有发生之前测试行为或进行研究。
  • 我很抱歉 --- 评论已删除。我应该要求更多澄清;我现在看到我没有完全理解这个问题。让我们看看其他人能想出什么。
  • awk 的哪个版本?如果gawk 您可以将FSRS 设置为正则表达式。您设置了一个不会发生的正则表达式,例如RS=FS="X^",整个文件被读取,$1 是整个文件。你是这个意思吗?如果没有示例输入和输出,您的问题就不清楚。

标签: awk delimiter csv


【解决方案1】:

如果您根据需要设置 RS 和 FS,我认为这可以正常工作。

给定:

$ echo -n $'a\bb\bc\177c\bd' | od -c
0000000    a  \b   b  \b   c 177   c  \b   d                            
0000011

你可以这样使用gawk

$ echo -n $'a\bb\bc\177c\bd' | awk -v FS=$'\b' -v RS=$'\177' '{ print NR, NF, $1, $2, $3}'
1 3 a b c
2 2 c d 

显然\b 会导致$0 的打印无法正确显示,但记录数、字段数和各个字段都符合预期。

注意 $'[string or character]' 的 Bashism 设置测试字符串以创建单个字符 RSFS awk 变量。

【讨论】:

  • 谢谢——这正是我所需要的。 bashism是我所缺少的。整理出包含退格、删除、箭头等的文件很奇怪,正如人们所期望的那样,但是能够使用我知道不先扫描就不能出现在文件中的字符很好
猜你喜欢
  • 1970-01-01
  • 2023-04-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-20
相关资源
最近更新 更多