한 파일의 열을 연결하는 awk/sed/etc

한 파일의 열을 연결하는 awk/sed/etc

이 작업을 수행하는 더 쉬운 방법이 있는지 궁금합니다.

awk 'NR > 1 {print $1"\t"$2"\t"$3"\t"$4"\t"$5"\t"$6"\t"$7"\t"$8"\t"$9$10$11$12$13$14$15$16}'  file.in > file.out

간단히 말해서 "사이에 있는 탭 문자를 제거하여 9열에서 16열을 결합합니다"입니다.

결합된 열 9-16은 "주석"이 되므로 공백을 포함할 수 있습니다.

현재 16개의 열이 있으나 필요에 따라 늘리거나 줄일 수 있습니다. 결국 열 9(9-16 연결)는 "설명" 필드가 됩니다.

건배,
시진핑

답변1

paste <(cut -f 1-8 file) <(cut -f9- file | tr -d '\t')

답변2

테이블로 구분된 값의 여러 행을 생성한다고 가정해 보겠습니다.

% perl -E 'say join "\t", 1..8 for 1..3'

그런 다음 개별 열은 필요에 따라 적절한 방법을 통해 처리될 수 있습니다.배너그리고변하기 쉬운그리고기능Perl에서 사용 가능합니다.

% perl -E 'say join "\t", 1..8 for 1..3' \
| perl -pale '$_=join "\t", @F[0..3], join "", @F[4..7] if $. > 1' 
1   2   3   4   5   6   7   8
1   2   3   4   5678
1   2   3   4   5678
% 

답변3

예, 여러 가지 방법이 있습니다. 생성된 파일에서 다음 두 가지를 테스트했습니다.

perl -le 'next if $.==1; for(1..20){print join "\t",1..20 }' > file

파일에는 20개의 행과 20개의 탭으로 구분된 열이 있습니다.

  1. 진주

    perl -F'\t' -ale '$"="\t";print "@F[0..7]",@F[8..$#F]' file 
    

    이렇게 하면 10번째 필드부터 끝까지 모든 필드가 연결됩니다. 9를 16에만 연결하려면 다음 명령을 사용하십시오.

    perl -F'\t' -ale '$"="\t"; print "@F[0..7]", @F[8..15], "\t@F[16..$#F]"' file 
    
  2. awk -F'\t' 'NR>1{
                    for(i=1;i<9;i++){
                        printf "%s\t",$i
                    }
                    for(i=9;i<=NF;i++){
                        printf "%s",$i
                    }print "" 
                }' file 
    

    이전과 마찬가지로 숫자 10 이후의 모든 열을 결합합니다. 9를 16에만 연결하려면 다음 명령을 사용하십시오.

    awk -F'\t' 'NR>1{
                    for(i=1;i<9;i++){
                        printf "%s\t",$i
                    }
                    for(i=9;i<=16;i++){
                        printf "%s",$i
                    }
                    for(i=17;i<=NF;i++){
                        printf "\t%s", $i
                    }
                    print ""
                }' file 
    

물론 awk솔루션이 아주 짧지는 않지만 최소한 모든 필드를 수동으로 지정할 필요는 없습니다.

답변4

GNU 사용 sed(필드가 입력에서 탭으로 구분되어 있다고 가정):

sed 's/\t//9g'

각 줄의 마지막 9번째 탭 문자를 삭제합니다.

입력에 16개가 넘는 필드가 있고 추가 필드가 필요하지 않은 경우:

cut -f 1-16 | sed 's/\t//9g'

관련 정보