我有一个|分隔的文件,希望替换日期为20200929至20201007的第2、4、6、7列.不包括收割台/拖车



文件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(其中包含总行数值(,则根据需要将字段设置为新值。1awk中打印当前行的一种方式。



第二个解决方案(在单个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'

相关内容

  • 没有找到相关文章

最新更新