文件e.lst:
H|data|ID|20200929|mni
1|20200929|mni|20200929|pqr|20200929|20200929
2|20200929|mni|20200929|abc|20200929|20200929
3|20200929|mni|20200929|lmn|20200929|20200929
4|20200929|mni|20200929|stu|20200929|20200929
T|count|123456
命令:
awk 'BEGIN {FS=OFS="|"} { $2=$4=$6=$7=20201007 } 1' e.lst > ne.lst
以上命令在标题/尾部记录中添加额外字段。
第一个解决方案: 请您尝试以下内容,并使用所示样本进行编写和测试。
awk -v lines=$(wc -l < Input_file) 'BEGIN{FS=OFS="|"} FNR>1 && FNR<lines{$2=$4=$6=$7="20201007"} 1' e.lst > ne.lst
或
awk -v lines=$(wc -l < Input_file) '
BEGIN{ FS=OFS="|" }
FNR>1 && FNR<lines{
$2=$4=$6=$7="20201007"
}
1
' e.lst > ne.lst
解释:只需创建一个包含总行数的awk
变量lines
。然后在BEGIN
块中设置字段分隔符和输出字段分隔符。在主块检查条件下,如果当前行数大于1
且小于lines
(其中包含总行数值(,则根据需要将字段设置为新值。1
是awk
中打印当前行的一种方式。
第二个解决方案(在单个awk
中,读取Input_file 2次(:我们也可以在一个awk
中通过读取Input_file 2次来做到这一点,试着这样做。
awk '
BEGIN{ FS=OFS="|" }
FNR==NR{
lines++
next
}
FNR>1 && FNR<lines{
$2=$4=$6=$7="20201007"
}
1
' e.lst e.lst > ne.lst
第三个解决方案:根据Sundeep先生的精彩评论,如果您的页眉和页脚行少于7个字段,其余行为7
字段,则您可以在不需要计算Input_file中的行总数的情况下执行此操作(但请确保满足上述条件,即对于此特定解决方案,Input_file的所有行(除第一行和最后一行外(应仅为7
字段(。
awk '
BEGIN{ FS=OFS="|" }
NF==7{
$2=$4=$6=$7="20201007"
}
1
' e.lst > ne.lst
我只需添加一个条件:
awk 'BEGIN {FS=OFS="|"} $1!="H"&&$1!="T"{ $2=$4=$6=$7=20201007 } 1'
或者,与正则表达式相同:
awk 'BEGIN {FS=OFS="|"} $1!~/^[HT]$/ { $2=$4=$6=$7=20201007 } 1'