使用linux将数据转换为所需的形式

时间:2014-07-06 04:05:45

标签: linux shell unix ubuntu

我在以制表符分隔的文件中有以下格式(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命令做同样的事情?

1 个答案:

答案 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个字段为非空,则返回单个空格,否则返回空字符串。