다른 모든 열을 결합하려면 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패턴 sed"B"가 발견되고 "B"로 대체되어 AB C최종 결과가 남습니다.

이 코드의 가정

예를 들어, 이 코드에서는 열 사이의 공백이 실제로 탭이 아니라 공백이라고 가정합니다. 이 문제는 쉽게 해결할 수 있지만 가독성이 저하됩니다.

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

관련 정보