行数が異なる.csvファイルをマージする

行数が異なる.csvファイルをマージする

ここでも同様の質問をしたことがあります。

これで3つの.csvファイルがあり、そのうちの1つには1行しかありません。

ファイル1.csv

dog
cats
mouse

ファイル2.csv

001a
002a
003c

ファイル3.csv

WORD

出力は次のようになります。

dog,001a,WORD
cats,002a,WORD
mouse,003c,WORD

ソリューション(前の質問から)例:

paste -d, file1.csv file2.csv | awk -F, '{print $1 "," $2 ",WORD"}'

しかし、「WORD」はここにのみ書かれており、file3.csvでは読み込まれません。

pastefile3.csvに各行を埋めるように指示する方法はありますか?それともfile3.csvを変数として保存して割り当てますかawk

答え1

もう一つの簡単な方法は次のとおりです。

$ paste  -d, file1 file2 file3 | awk 'BEGIN{FS=OFS=","} {if(NR==1){w=$3} else {$3=w}}1'
dog,001a,WORD
cats,002a,WORD
mouse,003c,WORD

答え2

$ paste -d, file1.csv file2.csv |
    awk -v OFS=',' 'NR==FNR{w=$0; next} {print $0, w}' file3.csv -
dog,001a,WORD
cats,002a,WORD
mouse,003c,WORD

答え3

fill-downサブコマンドの使用ミラーmlr)ファイルの長さに関係なく、すべての空のフィールドを前のレコードの対応するフィールド値で埋めることができます。

各ファイルのデータがヘッドレス CSV であると仮定し、次のコマンドは各レコードの 3 つのフィールドすべてに対してフィル操作を実行します。

paste -d, file1 file2 file3 | mlr -N --csv fill-down -f 1,2,3

実行例(短い2番目のファイルを使用していることに注意してください):

$ cat file1
dog
cats
mouse
$ cat file2
001a
002a
$ cat file3
WORD
$ paste -d, file1 file2 file3
dog,001a,WORD
cats,002a,
mouse,,
$ paste -d, file1 file2 file3 | mlr -N --csv fill-down -f 1,2,3
dog,001a,WORD
cats,002a,WORD
mouse,002a,WORD

pasteMiller用のTSVデータセットを作成し(デフォルトではなく区切り文字を設定しない)、--t2cTSVをCSVに変換するオプションを利用するバリアントです(--itsv2つのオプションと組み合わせのショートカット--ocsv)。

paste file1 file2 file3 | mlr -N --t2c fill-down -f 1,2,3

関連情報