替换大型 .txt 文件的 header 中的列 - unix
Replace column in header of a large .txt file - unix
我需要替换大文件 header 中的日期。所以我在 header 中有多个列,使用 |(pipe) 作为分隔符,如下所示:
A|B05|1|xxc|2018/06/29|AC23|SoOn
所以我需要相同的 header 但日期(第 5 列)已更新:A|B05|1|xxc|2018/08/29|AC23
有什么解决办法吗?我尝试使用 awk 和 sed,但它们都给我带来了比我更大的错误。我是这方面的新手,我真的很想了解解决方案。那你能帮帮我吗?
您可以使用以下命令用新日期变量的内容替换每行的第 5 列:
awk -v newdate="2018/08/29" 'BEGIN{FS=OFS="|"}{ = 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
}
{
= 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 [=11=]
' infile > outfile
如果你想跳过第一行,如果你有 header 那么使用 FNR>1
awk -v newdate="2018/08/29" 'BEGIN{FS=OFS="|"}FNR>1{ = newdate }1' infile > outfile
如果您只想替换第一行的第 5 列,请使用 FNR==1
awk -v newdate="2018/08/29" 'BEGIN{FS=OFS="|"}FNR==1{ = newdate }1' infile > outfile
If you still have problem, frame your question with sample input and
expected output, so that it will be easy to interpret your problem.
短sed解决方案:
sed -Ei '1s~\|[0-9]{4}/[0-9]{2}/[0-9]{2}\|~|2018/08/29|~' file
-i
- 修改文件in-place
1s
- 仅在第 1(header) 行替换
[0-9]{4}/[0-9]{2}/[0-9]{2}
- 日期格式
我需要替换大文件 header 中的日期。所以我在 header 中有多个列,使用 |(pipe) 作为分隔符,如下所示: A|B05|1|xxc|2018/06/29|AC23|SoOn
所以我需要相同的 header 但日期(第 5 列)已更新:A|B05|1|xxc|2018/08/29|AC23
有什么解决办法吗?我尝试使用 awk 和 sed,但它们都给我带来了比我更大的错误。我是这方面的新手,我真的很想了解解决方案。那你能帮帮我吗?
您可以使用以下命令用新日期变量的内容替换每行的第 5 列:
awk -v newdate="2018/08/29" 'BEGIN{FS=OFS="|"}{ = 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
}
{
= 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 [=11=]
' infile > outfile
如果你想跳过第一行,如果你有 header 那么使用 FNR>1
awk -v newdate="2018/08/29" 'BEGIN{FS=OFS="|"}FNR>1{ = newdate }1' infile > outfile
如果您只想替换第一行的第 5 列,请使用 FNR==1
awk -v newdate="2018/08/29" 'BEGIN{FS=OFS="|"}FNR==1{ = newdate }1' infile > outfile
If you still have problem, frame your question with sample input and expected output, so that it will be easy to interpret your problem.
短sed解决方案:
sed -Ei '1s~\|[0-9]{4}/[0-9]{2}/[0-9]{2}\|~|2018/08/29|~' file
-i
- 修改文件in-place1s
- 仅在第 1(header) 行替换[0-9]{4}/[0-9]{2}/[0-9]{2}
- 日期格式