获取命令输出中第四列的所有字符串值的最快方法

获取命令输出中第四列的所有字符串值的最快方法
Item Name        Data     Price            Comment 
shoes            Nike     20               Expensive item
pencil                                     Cheap price
bag                                        Most expensive 

目标是在考虑第 2 列和第 3 列的选项卡信息的情况下获取第 4 列的值。

使用awk '{print $4,$5}',我得到了预期的输出,但如果我对第二行执行此操作,则数据不正确。

答案1

如果您的数据是制表符分隔的并且您想要第四列,请cut与选项一起使用-f 4

cut -f 4 file

cut实用程序使用制表符作为其默认分隔符。

您的awk命令使用 的awk默认字段分隔符,它是任何连续的空格(制表符或空格)。使用,您可以-F '\t'将输入字段分隔符更改awk为制表符,请参阅awk与上述命令执行相同操作的方法cut

awk -F '\t' '{ print $4 }' file

使用稍微“高级”且支持 TSV 的工具(例如 Miller ( mlr)),您甚至可以按名称来寻址该列:

mlr --tsv cut -f Comment file

这会将数据读取为 TSV(“制表符分隔值”)并提取Comment每个输入记录(行)的字段。

(“TSV 感知”意味着它知道引用字段允许该字段嵌入制表符和换行符,就像在 CSV 文件中一样,如果awk没有额外的帮助就无法做到这一点。)

答案2

使用(以前称为 Perl_6)

我首先要说正则表达式是你的朋友。您实际上有 4 列,而不是 5 列吗?您可以通过以下方式快速可视化列:1)将标题/正文“字间距”转换为下划线,2)将制表符转换为逗号或竖线(或其他一些合适的替代品:

~$ raku -pe 's:g/\x0020/_/;' < file > tmp1
~$ cat tmp1
Item_Name   Data    Price   Comment 
shoes   Nike    20  Expensive_item
pencil          Cheap_price
bag         Most_expensive

#进而:

~$ raku -pe 's:g/\t/|/;'  < file > tmp2
~$ cat tmp2
Item_Name|Data|Price|Comment|
shoes|Nike|20|Expensive_item
pencil|||Cheap_price
bag|||Most_expensive

实际上,要提取第四列(零索引 = 3),此时的代码简化为:

~$ raku -ne 'put .split("|").[3] // "";' tmp2

上面的代码将保留空白(空)行;要删除空白行,请使用以下命令:

~$ raku -ne '.put with .split("|").[3];' tmp2

一旦您确信自己拥有正确的列,只需从一开始就在原始文件上运行上面的代码,并使用参数.split("\t")ie splitting on tab

示例输出(原始文件,分割\t):

Comment
Expensive item
Cheap price
Most expensive

https://docs.raku.org/language/regexes#\t_and_\T
https://raku.org

相关内容