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
ファイルで同じです。
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
)もう一度。
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にロードしてください!このツールキットは、データ準備のためのデータサイエンスで頻繁に使用されます。
ここに別の美しいものがあります。これまでのところ、すべての提案の中で最も簡単だと思います。
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
選択した数の列をあるファイルから別のファイルに移動するには:
#!/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
それを空のファイルにコピーし、パスをfile1
、file2
、および移動する列の数に設定し、move.py
として保存して実行します:
python3 /path/to/move.py
この方法で、ソースファイルの列の中央から1つ以上の列を追加することもできます。
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