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