我在以制表符分隔的文件中有以下格式(filename.tsv)的数据:
#a 0 Espert A trius
#b 9 def J
我想将数据转换为以下形式(我在这里每隔一行介绍一次):
#@<a>
<0 Espert> <abc> <A trius>.
#@<b>
<9 def> <abc> <J>.
我在每一行都介绍。我知道使用csv模块使用python做同样的事情。但我正在尝试学习linux命令,有没有办法在linux终端上使用像grep这样的linux命令做同样的事情?
答案 0 :(得分:2)
awk
似乎是正确的工具:
awk '{
printf "#@<%s>\n<%s %s> <abc> <%s%s%s>.\n",
substr($1,2),
$2,
$3,
$4,
(length($5) ? " " : ""),
$5
}' filename.tsv
awk
遍历输入文件中的所有行,并通过选项卡和/或空格的运行将每行分成字段; $1
指的是第一个字段$2
,第二个字段,...... printf
的功能与C中的相同:包含占位符的格式(模板)字符串后面跟着相应的参数来替换占位符。substr($1,2)
返回从第2个字符开始的第1个字段的子字符串(即,第1行为a
,第2行为b
- 请注意{{1}中的索引是基于 1 的。awk
是一个C风格的三元表达式,如果第5个字段为非空,则返回单个空格,否则返回空字符串。