如何添加"标题"到Awk

时间:2017-04-06 21:25:42

标签: linux bash awk

我在印刷/邮寄行业工作,经常发现有必要将标题或称呼合并到邮件列表的名称字段中。给定以下文件格式:

**SEQ_NO**    | **NAME**  | **COMPANY**        | **so on**  
:------------ | :-------- | :----------------- | :---------------  
1             | name1     | company1           | blahblah        |  
2             | name2     | company2           | blaseblah       |  

我打算做的是添加",DC"到每个名称的末尾,产生name1,DC name2,DC

我在Awk(管道分隔文件输入和输出)中使用以下内容在本网站上的另一个问题的帮助下尽可能地找到了:

awk -F'|' -vOFS='|' '{$2 = $2 ", DC" }1' [input file] > [output file]

但是,这会将附加文本添加到标题行,我也希望避免使用。当然,在一行上手动编辑并不需要很长时间,但理想情况下希望将上述脚本合并到现有的Perl脚本中,并希望了解实现上述结果的方法,除非不必删除",DC"来自第2栏标题。

P.S。抱歉格式化问题,新发布在这里。

2 个答案:

答案 0 :(得分:0)

在代码中添加NR > 2条件。这意味着它只对第2行及以上的行生效。

$ gawk -F'|' -vOFS='|' 'NR > 2 {$2 = $2", DC" }1' data.txt
SEQ_NO | NAME | COMPANY | so on
:------------ | :-------- | :----------------- | :---------------
1 | name1 , DC| company1 | blahblah |
2 | name2 , DC| company2 | blaseblah |

答案 1 :(得分:0)

试试这个 -

$ cat file.txt
**SEQ_NO**    | **NAME**  | **COMPANY**        | **so on**
:------------ | :-------- | :----------------- | :---------------
1             | name1     | company1           | blahblah        |
2             | name2     | company2           | blaseblah       |
$
$
$ cat filter.awk
BEGIN{FS=OFS="|"}
{
 if($1 ~ /[[:digit:]]/)
 {
  gsub(/[[:space:]]+ /,", DC ",$2); print
 }
 else
 {
  print $0
 }
}

$ awk -f filter.awk file.txt
**SEQ_NO**    | **NAME**  | **COMPANY**        | **so on**
:------------ | :-------- | :----------------- | :---------------
1             | name1, DC | company1           | blahblah        |
2             | name2, DC | company2           | blaseblah       |

解释 -

$1 ~ /[[:digit:]]/               : Looking for numeric field in column 1 i.e., SEQ_NO.
gsub(/[[:space:]]+ /,", DC ",$2) : Searhing for multiple space in column 2 and replacing them with ", DC".