쉘: 여러 테이블 결합

쉘: 여러 테이블 결합

동일한 작업 디렉터리에 동일한 수의 행(열 사이에 | 구분 기호 포함)을 포함하고 첫 번째 열의 순서를 공유하는 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 )

관련 정보