【问题标题】:Extract character-based columns and add delimiter using cut, awk, or sed提取基于字符的列并使用 cut、awk 或 sed 添加分隔符
【发布时间】:2020-05-18 19:59:28
【问题描述】:

我有一个如下所示的文件:

foo 23   45
bar      46
baz 25   57

它不是一个分隔文件。相反,基于字符的列具有特定的含义,记录如下:

  • 1-3 列代表一个事物。
  • 第 4 列是填充物。
  • 第 5-6 列代表一个事物。
  • 第 7-9 列是填充符
  • 第 10-11 列代表一个事物。

请注意,(a) 没有分隔符(填充列的长度不规则)和 (b) 一些有意义的列用空格填充。

有数千列。

我想从此文件中提取某些列并将它们转换为更标准的分隔格式。由于有数千列,并且文档仅引用基于字符的列索引,我想在我的命令中使用这些索引,而不是语义列索引。例如,如果我想要第一列和最后一列,我希望输出文件如下所示:

foo,45
bar,46
baz,57

根据文档,我希望命令将它们称为 1-3 和 10-11。

我试过了

cut -c 1-3,10-11 file.txt

但这不会在两个语义列之间产生分隔符。

我也可以试试:

awk '{print $1,$3}' fieldwidths="3 1 2 3 2" file.txt

但这需要知道语义列索引而不是字符列索引。鉴于有数千列,并且文档仅涉及字符列索引,这将非常困难。要了解这将是多么困难,请参阅文档(大约下降 25%)ftp://ftp.cdc.gov/pub/Health_Statistics/NCHS/Dataset_Documentation/DVS/periodlinked/LinkPE17Guide.pdf。这只是我需要阅读的几十个类似数据集之一。

谢谢!

【问题讨论】:

  • 请阅读How to Ask。你尝试了什么?
  • 请在您的问题中添加您的努力并让我们知道。届时也会取消删除我的答案。
  • 抱歉没有描述早期的尝试,感谢@RavinderSingh13 的awk 建议。我添加了关于如何有数千列的注释,并且文档仅引用基于字符的列索引。
  • @csaid,还不清楚,能否请您更清楚地描述您的输入样本和预期输出,然后告诉我们。
  • @csaid,fieldwidth 适用于字符长度概念。您可以在其值中提及字符长度,就像我在答案中显示的那样,它应该很好。让我们更清楚地了解您在其中面临的问题。

标签: awk sed cut


【解决方案1】:

我想出了答案: 来自 GNU Coreutils 的 gcut(不是我的 mac 上预装的 cut)有一个 --output-delimiter 选项:

gcut -c 1-3,10-11 --output-delimiter=',' file.txt

【讨论】:

  • awk 可以试试awk 'BEGIN{FS=","} {print substr($0,1,3),substr($0,10,2)}' Input_file 一次吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-03-01
  • 2019-10-20
  • 2017-12-03
  • 1970-01-01
  • 2021-08-29
  • 1970-01-01
  • 2019-11-12
相关资源
最近更新 更多