【问题标题】:manipulating space delimited text file操作空格分隔的文本文件
【发布时间】:2014-06-28 18:23:19
【问题描述】:

我有一个如下格式的文本文件

4 This is my test file 4500
5 This is test 6000
6 Not sure how it will work 9000

I want to extract data as follows

Field1 = 4
Field2 = This is my test file
Field3 = 4500

这是第一行,我想要这种格式的所有行。有人可以帮忙吗?我想做 sed 或 awk 没有 perl。我更喜欢 sed 和/或 awk。

我遇到了使用单引号或双引号将其括起来的 Field2(可能是单个单词或多个单词字符串)的问题。休息我想很容易。请帮忙

【问题讨论】:

  • 我不能真正将其称为正确的以空格分隔的文件,因为它无法区分空格作为分隔符和空格作为值。

标签: regex awk sed


【解决方案1】:

使用sed...

sed -re 's/(\S+)\s+(.*)\s+(\S+)/Field1 = \1\nField2 = \2\nField3 = \3/g' file

输出:

Field1 = 4
Field2 = This is my test file
Field3 = 4500
Field1 = 5
Field2 = This is test
Field3 = 6000
Field1 = 6
Field2 = Not sure how it will work
Field3 = 9000

【讨论】:

  • 由于 \s\n-r 仅适用于某些 sed,如果“字段 2”包含任何数字,则将失败。
  • 添加 ? 使其更不便携。如果您摆脱它并将最终的 RE 段锚定到行尾,我认为会更好:/^([0-9]+)\s+(.*)\s+([0-9]+)$。您甚至可以将[0-9]s 更改为\Ss,然后它保证可以在任何语言环境中工作,并且它不再关心这些字段是否为数字:/^(\S+)\s+(.*)\s+(\S+)$/
  • 现在看起来不错,+1。实际上,我看到您没有锚定最终的 RE 段,它仍然有效,因此您也不需要锚定第一个。关于对称性...... :-)。
  • 感谢您的反馈。
  • 当我用真实数据测试两个版本的 awk 和 sed 时,sed 完美地返回了数据。谢谢大家的帮助。我和sed一起去。啊啊啊啊啊啊。
【解决方案2】:

想出一个适用于给定样本输入集的“解决方案”几乎总是很容易,但想出一个有效的“解决方案”要困难得多。在选择“解决方案”之前,请认真考虑您在现实世界中可能的输入。如果您的输入中的字段少于 3 个,则此选项可能不会产生您想要的输出,如果有可能更新您的示例输入和预期输出以显示您希望如何处理。

$ awk '{
         f2=$0
         gsub(/^[^[:space:]]+[[:space:]]+|[[:space:]]+[^[:space:]]+$/,"",f2)
         print "field1 =", $1
         print "field2 =", f2
         print "field3 =", $NF
}' file
field1 = 4
field2 = This is my test file
field3 = 4500
field1 = 5
field2 = This is test
field3 = 6000
field1 = 6
field2 = Not sure how it will work
field3 = 9000

【讨论】:

  • 使用 awk 的不错的解决方案。 +1
【解决方案3】:

它并不完美,但你可以尝试使用这个awk

awk '{s=$1;e=$NF; $1=$NF=""; gsub(/^ +| +$/, ""); 
            printf "f1=<%s>,f2=<%s>,f3=<%s>\n", s, $0, e}' file
f1=<4>,f2=<This is my test file>,f3=<4500>
f1=<5>,f2=<This is test>,f3=<6000>
f1=<6>,f2=<Not sure how it will work>,f3=<9000>

【讨论】:

  • 效果很好。我只是想将第二个字段用引号括起来,这样我就可以在它周围放置管道分隔符。谢谢。
  • 很高兴知道它成功了,您能否通过单击我的答案左上角的勾号将答案标记为已接受。
  • 此解决方案的唯一问题是它会更改“字段 2”中存在的任何空白,因此例如制表符或空格序列将变为单个空格字符。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多