これで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では読み込まれません。
paste
file3.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
paste
Miller用のTSVデータセットを作成し(デフォルトではなく区切り文字を設定しない)、--t2c
TSVをCSVに変換するオプションを利用するバリアントです(--itsv
2つのオプションと組み合わせのショートカット--ocsv
)。
paste file1 file2 file3 | mlr -N --t2c fill-down -f 1,2,3