sed 또는 awk를 사용하여 다른 모든 열에 참여하세요.

sed 또는 awk를 사용하여 다른 모든 열에 참여하세요.

다음 형식의 큰 텍스트 파일(666000열)이 있습니다.

A B C D E F

원하는 출력

AB CD EF

sed또는 에서 어떻게 할 수 있습니까 awk? 나는 몇 가지를 시도했지만 아무것도 작동하지 않는 것 같습니다. 뭔가를 제안해주세요.

답변1

안에 sed:

sed 's! \([^ ]\+\)\( \|$\)!\1 !g' your_file

이렇게 하면 대체가 이루어지고 결과가 표준 출력으로 인쇄됩니다. 파일을 제자리에서 수정하려면 -i스위치를 추가하세요.

sed -i 's! \([^ ]\+\)\( \|$\)!\1 !g' your_file

설명

sed명령은 공백, 공백이 아닌 문자 하나 이상, 공백 또는 줄 끝을 찾습니다. 이 시퀀스는 공백이 아닌 문자 뒤에 단일 공백이 오는 문자로 대체됩니다. g수정자는 끝에 제공되므로 대체는 라인 전체에 걸쳐 가능한 한 많이 적용됩니다(이를 전역 대체라고 함) . 따라서 기본적으로 와 A B C같은 시퀀스를 사용하면 "B" 패턴을 찾아 "B"로 대체하여 최종 결과로 sed를 남깁니다 .AB C

이 코드의 가정

이 코드는 열 사이의 공백이 실제로는 공백이고 TAB이 아니라고 가정합니다. 이는 가독성을 희생하여 쉽게 수정할 수 있습니다.

sed 's![[:blank:]]\+\([^[:blank:]]\+\)\([[:blank:]]\+\|$\)!\1 !g' your_file

답변2

  • 이상한:

    awk '{printf $1$2;for(i=3; i<=NF;i+=2){printf " %s",$i$(i+1)}print}' file 
    

    대용량 파일의 경우 아마도 이 방법이 가장 빠를 것입니다.

  • 펄:

    perl -pe 's/([^\s]+)\s+([^\s]+)/$1$2/g' file
    

답변3

RS파일에 실제로 그렇게 많은 열이 있는 경우 한 가지 옵션은 gawk를 사용하여 "하나 이상의 공백 문자"로 설정하여 각 열을 레코드로 처리하는 것입니다 . 이렇게 하면 열을 통해 루프를 설정하지 않아도 됩니다. 이 솔루션은 한 줄에 홀수 개의 열이 있으면 취약합니다.

awk --re-interval -v RS='[[:space:]]{1,}' '{x=$0; getline; printf x$0RT}' file

관련 정보