簡體   English   中英

使用 awk 將 csv 拆分為多個文件 header

[英]Splitting csv into multiple files with header using awk

我正在嘗試使用 awk 將基於唯一列值的 csv 文件拆分為多個文件。我能夠使用awk -F\, '{print > $2".csv"}' example.csv成功拆分 csv 但是它是從新文件中提交 header 列。

例如:

example.csv

Color,Car,Make
Red,Kia,Spectra
Orange,Kia,Sportage
Green,Ford,Explorer
Black,Ford,F-150

結果:

Kia.csv

Red,Kia,Spectra
Orange,Kia,Sportage
___________________
Ford.csv

Green,Ford,Explorer
Black,Ford,F-150

我想要的 output:

Kia.csv

Color,Car,Make
Red,Kia,Spectra
Orange,Kia,Sportage
___________________
Ford.csv

Color,Car,Make
Green,Ford,Explorer
Black,Ford,F-150

為了嘗試將 header 列傳遞給新文件,我嘗試了類似這樣awk -F'|' 'FNR==1{hdr=$0;next} {if (;seen[$1]++) print hdr>$2. print>$2}' example.csv awk -F'|' 'FNR==1{hdr=$0;next} {if (;seen[$1]++) print hdr>$2. print>$2}' example.csv awk -F'|' 'FNR==1{hdr=$0;next} {if (;seen[$1]++) print hdr>$2. print>$2}' example.csv但不幸的是,這沒有達到預期的結果。

你快到了。 你能試試嗎:

awk -F, '
    FNR==1 {header = $0; next}
    !seen[$2]++ {print header > $2".csv"}
    {print > $2".csv"}
' example.csv

如果您的汽車品牌種類繁多,可能會出現“打開文件過多錯誤”。 在這種情況下,請關閉引用@RavinderSingh13 答案的文件。

第一個解決方案:使用您顯示的示例,請嘗試使用以下awk代碼。

awk -F, '
FNR==NR{
  header=$0
  next
}
{
  outputFile=$2".csv"
}
prev!=$2".csv" || !prev{
  close(prev)
  print header > (outputFile)
}
{
  print $0 > (outputFile)
  prev=outputFile
}
' <(head -1 Input_file) <(tail -n +2 Input_file | sort -t, -k2)


第二種解決方案:僅通過讀取 Input_file 的 1 遍添加解決方案。

awk -F, -v header=$(head -1 Input_file) '
{
  outputFile=$2".csv"
}
prev!=$2".csv" || !prev{
  close(prev)
  print header > (outputFile)
}
{
  print $0 > (outputFile)
  prev=outputFile
}
' <(tail -n +2 Input_file | sort -t, -k2)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM