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

替换大型.txt文件标题中的列-unix,unix,awk,sed,header,large-files,Unix,Awk,Sed,Header,Large Files,我需要替换一个大文件头中的日期。所以我在标题中有多个列,使用|(pipe)作为分隔符,如下所示: A | B05 | 1 | xxc | 2018/06/29 | AC23 |不久 因此,我需要相同的标题,但日期(第5列)已更新:A | B05 | 1 | xxc | 2018/08/29 | AC23 有什么解决办法吗?我尝试了awk和sed,但它们都给我带来了比我更大的错误。我是新手,我真的很想了解解决方案。您能帮我一下吗?您可以使用下面的命令,用newdate变量的内容替换每行的第5列:

我需要替换一个大文件头中的日期。所以我在标题中有多个列,使用|(pipe)作为分隔符,如下所示: A | B05 | 1 | xxc | 2018/06/29 | AC23 |不久

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


有什么解决办法吗?我尝试了awk和sed,但它们都给我带来了比我更大的错误。我是新手,我真的很想了解解决方案。您能帮我一下吗?

您可以使用下面的命令,用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
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
awk -v newdate="2018/08/29" 'BEGIN{FS=OFS="|"}FNR==1{ $5 = newdate }1' infile > outfile
如果您仍然有问题,请使用示例输入和 期望的输出,以便很容易解释您的问题

Shortsed解决方案:

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}
    -日期模式


显示您的工作和错误消息。这是一个了不起的发现。对我来说,正确的解决方案是最后一个,并且可以正常工作。非常感谢你!你好,谢谢你的回答。当我使用您的解决方案时,我收到一条错误消息@Light,请使用这个
sed-E-i.bak'1s~\\[0-9]{4}/[0-9]{2}/[0-9]{2}\\\\\~~ 2018/08/29 | ~”文件