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
"join"과 "paste"를 사용해 보았습니다. 이 작업을 수행하는 bash 명령이 있습니까? "A"열은 두 .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
"join"과 "paste"를 사용해 보았습니다. 이 작업을 수행하는 bash 명령이 있습니까? "A"열은 두 .csv
파일 에서 동일 합니다.
답변:
awk
명령 만으로 :awk -F, '{getline f1 <"file2" ;print f1,$3,$4}' OFS=, file1
file1에서 줄을 가져 와서 로컬 변수에 저장 f1
한 다음 저장 한 줄을 f1
인쇄하고 마지막 으로 쉼표로 구분 된 file1에서 세 번째 ( $3
) 및 앞으로 ( $3
) 필드를 인쇄 ,
하고 OFS (출력 필드 구분 기호 [space by 기본값])을 쉼표 ( ,
)로
paste -d, file2 <(cut -d, -f3- file1)
A, B, C, D A, B, C, D A, B, C, D A, B, C, D
file2를 붙여 넣은 다음 세 번째 열을 잘라서 -f3-
file1 의 다음 열 ( )에 붙여 넣습니다 .
awk
와 paste
(옵션 A)아래 명령은 또한 C,D
file2의 각 줄 끝에있는 file1 의 마지막 두 열 ( )을 복사합니다 .
paste -d',' file2 <(awk -F',' '{print $(NF-1)","$NF}' file1)
위의 명령 은 file2 내용을 붙여 넣은 다음 쉼표 구분 기호 ( -d','
) 를 인쇄 한 다음 두 개의 마지막 필드를 붙여 넣습니다 (마지막 필드 NF
의 인덱스이며 인덱스 $NF
가있는 문자열입니다 NF
. $(NF-1)
마지막 필드 앞의 두 번째 필드입니다). 또는 쉼표 관전자 ( -F','
) 로 분할 합니다.
awk
와 paste
(옵션 B)또한이 명령은 (상기와 동일 $3
하고 $4
FILE1의 각 라인의 제 전후 필드 점) :
paste -d',' file2 <(awk -F',' '{print $3","$4}' file1)
cut
명령이있는 다른 솔루션 :paste -d, <(cut -d, -f1 file1) <(cut -d, -f2 file2) <(cut -d, -f3- file1)
절단 된 상기 명령의 명령은 먼저 (최초 필드 절단 -f1
콤마 분리 (색인화 -d.
FILE1 (행)) cut -d, -f1 file1
) 다음, 절단 및 파일 2 (두 번째 필드를 붙여 cut -d, -f2 file2
) 마지막으로 잘라내어 (세 번째 열에 붙여 -f3
합니다 (nexts에) -
) file1 ( 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
) 에서 두 번째 필드를 붙여넣고 쉼표 ( )를 인쇄 한 -d,
다음 file2 ( awk -F',' '{print $2}' file2
) 에서 두 번째 열을 붙여넣고 마지막으로 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. 원하는 실제 열을 공급하십시오. 첫 번째 열에 조인이 실제로 수행되는 열이므로 두 번 공급하는 방법에 유의하십시오 (기본 동작은 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)으로 작동하며 텍스트처럼 취급하지 않습니다.
둘째, 매우 강력한 csv 툴킷을 사용하여 a) 하나의 명령으로 통계 표시 ( csvstats)
, b) 데이터가 깨끗한 지 확인 ( csvclean
)하지만 데이터 를 json, sql 또는 심지어로드 할 수 있습니다 파이썬! 이 툴킷은 데이터 준비를 위해 데이터 과학에서 많이 사용됩니다.
여기 또 다른 아름다운 것이 있습니다. 나는 그것이 지금까지 모든 제안 중 가장 쉬운 것이라고 생각합니다.
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
우리의 경우 파일의 두 번째 열을 어떻게 대체하는지 주목하십시오.
file1.csv
A,,C,D
A,,C,D
A,,C,D
A,,C,D
file2.csv
A,B
A,B
A,B
A,B
두 파일을 결합 :
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 열을 2 열의 붙여 넣는 것 입니다 file1.csv
.
이것은 동일한 문서에서도 작동합니다. 두 개의 열을 바꾸려면 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:]))
두 파일에서 :
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
이 방법으로 소스 파일 열의 중간에서 하나 이상의 열을 추가 할 수도 있습니다.
import csv
입니다.
csv 모듈을 통한 파이썬의 또 다른 방법.
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