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