【发布时间】: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 适用于字符长度概念。您可以在其值中提及字符长度,就像我在答案中显示的那样,它应该很好。让我们更清楚地了解您在其中面临的问题。