デフォルトでは、cols.csvという複数の列を持つcsvファイルがあります。
1,a,100
2,b,200
3,c,300
4,e,400
col.csvという列を持つ新しいcsvファイルがあります。
f
g
h
i
col.csvのエントリをコピーしてcols.csvの各行の末尾に追加し、cols.csvにこれらのエントリが含まれるようにしたいと思います。
1,a,100,f
2,b,200,g
3,c,300,h
4,e,400,i
可能ですか?サインアップして貼り付けようとしましたが、何の効果もありませんでした。
答え1
コンテンツtest1.txt
1,a,100
2,b,200
3,c,300
4,e,400
コンテンツtest2.txt
f
g
h
i
サンプル。
$ paste -d, test1.txt test2.txt
1,a,100,f
2,b,200,g
3,c,300,h
4,e,400,i
説明する
この-d
フラグを使用して、区切り文字を次のように設定します。
答え2
-d
区切り文字をカンマに設定するには、貼り付けフラグを使用します。
paste -d, cols.csv col.csv
答え3
paste
改行を含む引用フィールドを含めることができるCSV入力を処理すると仮定すると、行ベースのツール(2つのファイルの組み合わせなど)は使用できません。これを行うと、誤った出力が生成されます。
次の例では、それぞれ3つのレコードを含む2つのファイルを使用しています。ここで、最初のファイルの2番目のフィールドには、各レコードに新しい行が含まれています。
file1
:
Field 1,Field 2
YYYYMMDD-XXXX,"10 Somestreet
NNNNNN Somecity"
YYYYMMDD-YYYY,"20 Otherstreet
MMMMMM Somecity"
YYYYMMDD-ZZZZ,"25 Bumble Rd
KKKKKK Village"
file2
:
Field 3
"1,a"
"1,b"
"2,c"
ここでは、paste
明らかに正しいことをすることはできません。
$ paste -d , file1 file2
Field 1,Field 2,Field 3
YYYYMMDD-XXXX,"10 Somestreet,"1,a"
NNNNNN Somecity","1,b"
YYYYMMDD-YYYY,"20 Otherstreet,"2,c"
MMMMMM Somecity",
YYYYMMDD-ZZZZ,"25 Bumble Rd,
KKKKKK Village",
代わりにCSVというツールを使用してください。ミラー(mlr
)は、フィールドと呼ばれるレコード番号を2つのファイルの各レコードに追加します。 Millerオプションをnr
使用して、-I
ファイル「所定の位置」にフィールドを追加します。
$ mlr --csv -I put '$nr=FNR' file1 file2
次に、この番号を使用してファイルを結合します。
$ mlr --csv join -f file1 -j nr file2
nr,Field 1,Field 2,Field 3
1,YYYYMMDD-XXXX,"10 Somestreet
NNNNNN Somecity","1,a"
2,YYYYMMDD-YYYY,"20 Otherstreet
MMMMMM Somecity","1,b"
3,YYYYMMDD-ZZZZ,"25 Bumble Rd
KKKKKK Village","2,c"
タスクがもはや役に立たない場合は、cut
フィールドを削除できます。nr
$ mlr --csv join -f file1 -j nr then cut -x -f nr file2
Field 1,Field 2,Field 3
YYYYMMDD-XXXX,"10 Somestreet
NNNNNN Somecity","1,a"
YYYYMMDD-YYYY,"20 Otherstreet
MMMMMM Somecity","1,b"
YYYYMMDD-ZZZZ,"25 Bumble Rd
KKKKKK Village","2,c"