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