이 작업을 수행하는 더 쉬운 방법이 있는지 궁금합니다.
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개의 탭으로 구분된 열이 있습니다.
진주
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
앗
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'