awk/bash 在许多 csv 文件中追加 headers
awk/bash append headers in many csv files
我想使用 awk 和 bash 脚本自动转换许多 csv 文件的 header。
目前,我正在使用以下 code-block,工作正常:
for FILE in *.csv;
do
awk 'FNR>1{print [=12=]}' $FILE | awk 'NR == 1{print "aaa,bbb,ccc,ddd,eee,fff,ggg,hhh,iii,jjj,kkk,lll,mmm,nnn,...,zzz"}1' > OUT_$FILE
done
这些命令所做的是,它首先从 $FILE
中删除旧的 header,然后 append 添加一个新的 comma-separated(很长)header aaa,bbb,ccc,ddd,eee,fff,ggg,hhh,iii,jjj,kkk,lll,mmm,nnn,...,zzz
到 $FILE
然后将输出保存到 OUT_$FILE
.
目前,我正在从另一个 csv 文件手动复制 aaa,bbb,ccc,ddd,eee,fff,ggg,hhh,iii,jjj,kkk,lll,mmm,nnn,...,zzz
部分并粘贴到此字段以替换 $FILE
中的 header。虽然它正在工作,但对于许多 csv 文件来说,它变得乏味、重复和 time-consuming。
我没有手动复制 header,而是尝试从另一个 csv 文件 new_headers.csv
中提取 header 并保存到新变量 $NEWHEAD
。
NEWHEAD=$(awk 'NR==1{print [=13=]}' new_headers.csv)
虽然我可以查看提取的 header $NEWHEAD
,但我不确定如何将此命令合并到以前的工作流程中以 append 在 headers 来自 $FILE
.
对于解决此问题的任何建议,我将不胜感激。谢谢:)
newheader=$(head -n 1 new_headers.csv)
for file in *.csv
do
{
printf '%s\n' "$newheader"
tail -n +2 "$file"
} > OUT_"$file"
done
备注:
head -n 1
输出文件的第一行
tail -n +2
输出除第一行以外的所有行
{ }
是对命令进行分组,这样你就可以将它们的输出作为一个整体重定向
您可以阅读 awk
脚本中的 header,像这样
awk '
BEGIN{
do {
h = (h) ? (h "\n" line) : line
} while ((getline line <"new_header.csv") > 0)
}
...
'
和 h
包含新的 header。
$ awk 'NR==FNR {header=[=10=]; next}
{print (FNR==1?header:[=10=]) > (FILENAME".updated")}' new_header.csv other files...
从头文件中捕获第一条记录并替换其余文件的第一行,更新后的文件将具有后缀“.updated”。
买者自负 未测试。
使用 GNU awk 进行“就地”编辑:
awk -i inplace 'NR==1{hdr=[=10=]} {print (FNR>1 ? [=10=] : hdr)}' new_headers.csv *.csv
我想使用 awk 和 bash 脚本自动转换许多 csv 文件的 header。
目前,我正在使用以下 code-block,工作正常:
for FILE in *.csv;
do
awk 'FNR>1{print [=12=]}' $FILE | awk 'NR == 1{print "aaa,bbb,ccc,ddd,eee,fff,ggg,hhh,iii,jjj,kkk,lll,mmm,nnn,...,zzz"}1' > OUT_$FILE
done
这些命令所做的是,它首先从 $FILE
中删除旧的 header,然后 append 添加一个新的 comma-separated(很长)header aaa,bbb,ccc,ddd,eee,fff,ggg,hhh,iii,jjj,kkk,lll,mmm,nnn,...,zzz
到 $FILE
然后将输出保存到 OUT_$FILE
.
目前,我正在从另一个 csv 文件手动复制 aaa,bbb,ccc,ddd,eee,fff,ggg,hhh,iii,jjj,kkk,lll,mmm,nnn,...,zzz
部分并粘贴到此字段以替换 $FILE
中的 header。虽然它正在工作,但对于许多 csv 文件来说,它变得乏味、重复和 time-consuming。
我没有手动复制 header,而是尝试从另一个 csv 文件 new_headers.csv
中提取 header 并保存到新变量 $NEWHEAD
。
NEWHEAD=$(awk 'NR==1{print [=13=]}' new_headers.csv)
虽然我可以查看提取的 header $NEWHEAD
,但我不确定如何将此命令合并到以前的工作流程中以 append 在 headers 来自 $FILE
.
对于解决此问题的任何建议,我将不胜感激。谢谢:)
newheader=$(head -n 1 new_headers.csv)
for file in *.csv
do
{
printf '%s\n' "$newheader"
tail -n +2 "$file"
} > OUT_"$file"
done
备注:
head -n 1
输出文件的第一行tail -n +2
输出除第一行以外的所有行{ }
是对命令进行分组,这样你就可以将它们的输出作为一个整体重定向
您可以阅读 awk
脚本中的 header,像这样
awk '
BEGIN{
do {
h = (h) ? (h "\n" line) : line
} while ((getline line <"new_header.csv") > 0)
}
...
'
和 h
包含新的 header。
$ awk 'NR==FNR {header=[=10=]; next}
{print (FNR==1?header:[=10=]) > (FILENAME".updated")}' new_header.csv other files...
从头文件中捕获第一条记录并替换其余文件的第一行,更新后的文件将具有后缀“.updated”。
买者自负 未测试。
使用 GNU awk 进行“就地”编辑:
awk -i inplace 'NR==1{hdr=[=10=]} {print (FNR>1 ? [=10=] : hdr)}' new_headers.csv *.csv