여러 개의 파일(10개 이상)이 있고 이를 하나의 출력 파일로 병합/결합하고 싶습니다. 예를 들면 다음과 같습니다.
파일 1
2000 0.0202094
2001 0.0225532
2002 0.02553
2003 0.0261099
2004 0.0280311
2005 0.028843
파일 2
2000 0.0343179
2001 0.036318
2003 0.039579
2004 0.0412106
2005 0.041264
파일 3
2004 0.068689
2005 0.0645474
모든 파일에는 동일한 두 개의 열이 있지만 길이는 다릅니다.
원하는 출력은 다음과 같습니다.
file1 file2 file3
2000 0.0202094 0.0343179
2001 0.0225532 0.036318
2002 0.02553
2003 0.0261099 0.0395799
2004 0.0280311 0.0412106 0.0686893
2005 0.028843 0.041264 0.0645474
다음 코드를 시도했지만 값이 첫 번째 열과 일치하지 않습니다.
awk '{printf($1); for(i=2;i<=NF;i+=2) printf ("\t%s", $i); printf "\n"}' <(paste file*) > mergedfile.txt
답변1
awk
첫 번째 열 항목을 그룹화하여 이러한 모든 파일을 한 번에 실행할 수 있습니다 . 이 부분 map[$1]?(map[$1] FS $2):($2)
은 삼항 명령문입니다. 즉, 비어 있는 경우 로 인덱싱된 배열 맵에 추가하고 $1
, 비어 있지 않은 경우 이미 존재하는 값에 추가한다는 의미입니다.
awk '{ map[$1] = ($1 in map)?(map[$1] FS $2):($2); }
END { for(i in map) print i, map[i] }' file*
생성된 출력보다 출력을 더 읽기 쉽게 만들려면 awk
출력을 다음과 같이 파이프하십시오.
awk '{ map[$1] = ($1 in map)?(map[$1] FS $2):($2); }
END { for(i in map) print i, map[i] }' file* | column -t > mergedfile.txt
답변2
다음 스크립트로 완료
STEP1
awk '{print $1}' file1 file2 file3| awk '{if(!seen[$1]++){print $0}}' >pattern_content
STEP2
for i in `awk '{print $1}' file1 file2 file3| sort | uniq`; do grep "$i" file1>/dev/null; if [[ $? == 0 ]]; then grep $i file1| awk '{print $2}'; else echo " "; fi; done > file1_o
for i in `awk '{print $1}' file1 file2 file3| sort | uniq`; do grep "$i" file2>/dev/null; if [[ $? == 0 ]]; then grep $i file2| awk '{print $2}'; else echo " "; fi; done > file2_o
for i in `awk '{print $1}' file1 file2 file3| sort | uniq`; do grep "$i" file3>/dev/null; if [[ $? == 0 ]]; then grep $i file3| awk '{print $2}'; else echo " "; fi; done > file3_o
step3
paste pattern_content file1_o file2_o file3_o|sed '1i file1 file2 file3'| sed "s/file1/\t&/g"
산출
file1 file2 file3
2000 0.0202094 0.0343179
2001 0.0225532 0.036318
2002 0.02553
2003 0.0261099 0.0395799
2004 0.0280311 0.0412106 0.0686893
2005 0.028843 0.041264 0.0645474