替换大型.txt文件的标题中的列 - unix

时间:2017-08-29 17:40:55

标签: unix awk sed header large-files

我需要替换大文件头中的日期。所以我在标题中有多个列,使用|(管道)作为分隔符,如下所示: A | B05 | 1 | XXC | 2018年6月29日| AC23 |很快

所以我需要相同的标题,但日期(第5列)更新:A | B05 | 1 | xxc | 2018/08/29 | AC23

对我来说有什么解决方案吗?我尝试使用awk和sed,但是他们都给我带来了比我更大的错误。我对此很新,我真的很想了解解决方案。你能帮帮我吗?

2 个答案:

答案 0 :(得分:0)

您可以使用以下命令替换newdate变量内容的每一行的第5列:

awk -v newdate="2018/08/29" 'BEGIN{FS=OFS="|"}{ $5 = newdate }1' infile > outfile

<强>解释

awk -v newdate="2018/08/29" '    # call awk, and set variable newdate 
    BEGIN{
           FS=OFS="|"            # set input and output field separator
    }
    { 
           $5 = newdate          # assign fifth field with a content of variable newdate
    }1                           # 1 at the end does default operation 
                                 # print current line/row/record, that is print $0
  ' infile > outfile

如果您想在标题中跳过第一行,请使用FNR>1

awk -v newdate="2018/08/29" 'BEGIN{FS=OFS="|"}FNR>1{ $5 = newdate }1' infile > outfile

如果您只想替换第1行中的第5列,请使用FNR==1

awk -v newdate="2018/08/29" 'BEGIN{FS=OFS="|"}FNR==1{ $5 = newdate }1' infile > outfile
  

如果您仍有问题,请使用示例输入框架您的问题   预期的输出,这样就很容易解释你的问题。

答案 1 :(得分:0)

sed 解决方案:

sed -Ei '1s~\|[0-9]{4}/[0-9]{2}/[0-9]{2}\|~|2018/08/29|~' file
  • -i - 就地修改文件

  • 1s - 仅在第1(标题)行中替换

  • [0-9]{4}/[0-9]{2}/[0-9]{2} - 日期模式