다음 형식의 큰 텍스트 파일(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