동일한 작업 디렉터리에 동일한 수의 행(열 사이에 | 구분 기호 포함)을 포함하고 첫 번째 열의 순서를 공유하는 2개의 목록이 여러 개 있습니다. 다음은 8개 행을 포함하는 두 테이블의 예입니다.
표 1.csv
lig10| -5.4600
lig13| -5.9900
lig14| -4.2200
lig15| -4.9200
lig3| -6.9700
lig4| -7.4000
lig5| -6.0000
lig9| -6.5700
표 2.csv
lig10| -5.2400
lig13| -6.6900
lig14| -4.4600
lig15| -4.9600
lig3| -6.9000
lig4| -6.3100
lig5| -3.7900
lig9| -6.5800
매우 유사한 형식의 모든 테이블을 큰 테이블로 나란히 병합하여 결과 테이블에 병합된 파일 수에 비례하여 동일한 수의 행과 열이 포함되도록 모든 데이터를 가져오고 싶습니다. 예를 들어, 10개의 개별 테이블의 경우 20개의 열이 됩니다(참고: 모든 테이블이 동일하더라도 항상 첫 번째 열을 사용합니다!). 결과 테이블에서 각 두 번째 열에 헤더를 추가하고 싶습니다( 초기 테이블), 초기 파일 이름을 기준으로 합니다. 이는 테이블 2개에 대한 예상 출력입니다.
일부 Linux 유틸리티를 사용하여 한 줄의 명령으로 터미널의 테이블을 융합할 수 있습니까?
prog -i /workdir/*.csv -o resulting_table.csv
답변1
그것이 paste
목적입니다. 하지만 올바른 파일 이름을 얻으려면 몇 가지 작업을 수행해야 할 수도 있습니다.
$ ( printf '%s\t' *table*; echo; paste -d'\t' *table*)
name_of_file_with_table1 name_of_file_with_table2
lig10| -5.4600 lig10| -5.2400
lig13| -5.9900 lig13| -6.6900
lig14| -4.2200 lig14| -4.4600
lig15| -4.9200 lig15| -4.9600
lig3| -6.9700 lig3| -6.9000
lig4| -7.4000 lig4| -6.3100
lig5| -6.0000 lig5| -3.7900
lig9| -6.5700 lig9| -6.5800
첫 번째 파일의 첫 번째 열만 원하는 경우 훨씬 더 간단합니다.
$ ( printf '%s ' *table*; echo; join *table* )
name_of_file_with_table1 name_of_file_with_table2
lig10| -5.4600 -5.2400
lig13| -5.9900 -6.6900
lig14| -4.2200 -4.4600
lig15| -4.9200 -4.9600
lig3| -6.9700 -6.9000
lig4| -7.4000 -6.3100
lig5| -6.0000 -3.7900
lig9| -6.5700 -6.5800
파일이 정렬되지 않은 경우 먼저 파일을 정렬해야 합니다.
for f in *table*; do sort "$f" > $f.sorted; done
그런 다음:
( printf '%s ' *table*sorted; echo; join *table*sorted )