我在印刷/邮寄行业工作,经常发现有必要将标题或称呼合并到邮件列表的名称字段中。给定以下文件格式:
**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。抱歉格式化问题,新发布在这里。
答案 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".