web-dev-qa-db-ja.com

ある.csvから別の.csvファイルに列を追加する

file1.csv

A,,C,D
A,,C,D
A,,C,D
A,,C,D

file2.csv

A,B
A,B
A,B
A,B

必要なOutput.csv

A,B,C,D
A,B,C,D
A,B,C,D
A,B,C,D

「結合」と「貼り付け」を使用してみましたが、役に立ちませんでした。これを行うbashコマンドはありますか?列「A」は、両方の.csvファイルで同じです。

12
Roboman1723

awkコマンドのみの場合:

awk -F, '{getline f1 <"file2" ;print f1,$3,$4}' OFS=, file1

File1から行を取得してローカル変数f1に格納し、f1に格納された行を出力し、最後に3番目($3)および4番目($3)を出力しますコンマ,で区切られたfile1のフィールド、およびOFS(出力フィールド区切り文字[デフォルトでスペース])をコンマ(,)に変更します。


短いコマンドは次のようになります。

paste -d, file2 <(cut -d, -f3- file1)
 A、B、C、D 
 A、B、C、D 
 A、B、C、D 
 A、B、C、D 

file2を貼り付けてから、3番目の列をカットしてfile1のnext(-f3-)に貼り付けます。


awkおよびpasteを使用(オプションA)

以下のコマンドは、file2の各行の最後にあるfile1から最後の2列(C,D)もコピーします。

paste -d',' file2  <(awk -F',' '{print $(NF-1)","$NF}' file1)

上記のコマンド paste file2 content次にカンマ区切り文字(-d',')を出力し、最後の2つのフィールドを貼り付けます(NFは最後のフィールドのインデックスで、$NFはインデックスがNFである文字列。したがって、$(NF-1)は、それらのインデックスがコンマspectator(-F',')で再定義または分割される場合のfile1の最後のフィールドの前の2番目のフィールドです。

awkおよびpasteを使用(オプションB)

このコマンドも上記と同じです($3および$4はfile1の各行の3番目と4番目のフィールドを指します)。

paste -d',' file2  <(awk -F',' '{print $3","$4}' file1)

またはcutコマンドを使用した別のソリューション:

paste -d, <(cut -d, -f1 file1) <(cut -d, -f2 file2) <(cut -d, -f3- file1)

cut 上記のコマンドのコマンドは、最初にfile1(-f1)から最初のフィールド(-d.にコンマ区切り文字(cut -d, -f1 file1)でインデックス付けされた)をカットし、次にカットアンドペーストしますfile2(cut -d, -f2 file2)の2番目のフィールド、最後にfile1(-f3)からnexts(-)に3番目の列(cut -d, -f3- file1)をカットアンドペーストします。

このコマンドも同じ結果を返します。

paste -d, <(awk -F',' '{print $1}' file1) <(awk -F',' '{print $2}' file2) <(awk -F',' '{print $3","$4}' file1)

file1(awk -F',' '{print $1}' file1)の2番目のフィールドを貼り付け、次にコンマ(-d,)を印刷し、file2(awk -F',' '{print $2}' file2)の2番目の列を貼り付け、最後にfile1( awk -F',' '{print $3","$4}' file1)もう一度。

11
αғsнιη

ここに美しさがあります(私は思う):

join -t, <(csvcut -c 1,3,4 file1.csv) <(csvcut -c 1,2 file2.csv)

手順ごとに分類:

手順1. csvkitをインストールします。

Sudo pip install csvkit
Sudo apt-get install python-dev python-pip python-setuptools build-essential

手順2.カンマを区切り文字として使用してjoinコマンドを使用する

join -t,

ステップ3.希望する実際の列をフィードします。最初の列に2回入力することに注意してください。これは、実際に結合が実行されるためです(joinのデフォルトの動作)。

join -t, <(csvcut --columns 1,3,4 file1.csv) <(csvcut --columns 1,2 file2.csv)

または速記で:

join -t, <(csvcut -c 1,3,4 file1.csv) <(csvcut -c 1,2 file2.csv)

必要に応じて、その標準出力をファイル(desiredOutput)にリダイレクトできます。

長所

この方法には、提案されている他の方法に比べていくつかの利点があります。

何よりもまず、実際の結合を実行します。つまり、より複雑なデータにも使用できます。たとえば、別のフィールドで結合するのは非常に簡単です。フィールドの位置だけを見るのではなく、列を実際に考慮します。実際にはデータの形式(csv)で機能し、テキストのようには扱いません。

次に、a)1つのコマンドで統計情報を表示する(csvstats)、b)データがクリーンかどうかを確認する(csvclean)だけでなく、 json、sql、さらにはpythonにロードしてください!このツールキットは、データ準備のためのデータサイエンスで頻繁に使用されます。

9
don.joey

ここに別の美しいものがあります。これまでのところ、すべての提案の中で最も簡単だと思います。

csvtool pastecol 2 2 file1.csv file2.csv

過去にcsvtoolをまだインストールしていない場合は、Sudo apt-get install csvtoolする必要があります。

ドキュメントから:

pastecol <column-spec1> <column-spec2> input.csv update.csv

ファイルinput.csvで参照される列のコンテンツを、update.csvで指定された対応する列のコンテンツに置き換えます。

例:

  csvtool pastecol 2-3 1- input.csv update.csv.csv > output.csv

この場合、ファイルの2番目の列をどのように置き換えているかに注意してください。

file1.csv

A,,C,D
A,,C,D
A,,C,D
A,,C,D

file2.csv

A,B
A,B
A,B
A,B

2つのファイルを結合します。

csvtool pastecol 2 2 file1.csv file2.csv
A,B,C,D
A,B,C,D
A,B,C,D
A,B,C,D

基本的には、file2.csvの列2をfile1.csvの列2として貼り付けます。

これは同じドキュメントでも機能することに注意してください。 2つの列を交換する場合は、input.csvおよびupdate.vscと同じファイルを使用して交換できます。

csvtool pastecol 2 1 file2.csv file2.csv 
A,A
A,A
A,A 
A,A
7
don.joey

選択した数の列をあるファイルから別のファイルに移動するには:

#!/usr/bin/env python3

cols = 1; file_1 = "/path/to/file_1"; file_2 = "/path/to/file_2"

def readfile(file):
      with open(file) as src:
          return [item.strip().split(",") for item in src.readlines()]

file_1 = readfile(file_1); file_2 = readfile(file_2)

for i in range(len(file_1)):
    print((",").join(file_1[i]+file_2[i][-cols:]))

2つのファイルから:

file_1

A,B
A,B
A,B
A,B

file_2

K,L,M
K,L,M
K,L,M
K,L,M

cols = 1を設定すると:

A,B,M
A,B,M
A,B,M
A,B,M

ただし、cols = 2を設定すると:

A,B,L,M
A,B,L,M
A,B,L,M
A,B,L,M

cols = 3

A,B,K,L,M
A,B,K,L,M
A,B,K,L,M
A,B,K,L,M

使い方

それを空のファイルにコピーし、パスをfile1file2、および移動する列の数に設定し、move.pyとして保存して実行します:

python3 /path/to/move.py

この方法で、ソースファイルの列の中央から1つ以上の列を追加することもできます。

2
Jacob Vlijm

Csvモジュールを介したpythonの別のメソッド。

script.py

#!/usr/bin/python3
import csv
import sys
file1 = sys.argv[1]
file2 = sys.argv[2]
with open(file2, 'r') as r:
    with open(file1, 'r') as f:
        csv_f = csv.reader(f)
        csv_r = csv.reader(r)
        bar = [linex for linex in csv_r]
        foo = [liney[2:] for liney in csv_f]
        zipped = Zip(bar,foo)
        result = [x+y for (x,y) in list(zipped)]
        for i in result:
            print(','.join(i))

上記のスクリプトを実行するには、

python3 script.py file1 file2

出力:

A,B,C,D
A,B,C,D
A,B,C,D
A,B,C,D
0
Avinash Raj