ファイルから列を読み取り、既存のcsvファイルに列を書き込みます。

ファイルから列を読み取り、既存のcsvファイルに列を書き込みます。

デフォルトでは、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"

関連情報