짝수 행을 홀수 행의 시작 부분으로 이동하는 방법을 찾고 있습니다.

짝수 행을 홀수 행의 시작 부분으로 이동하는 방법을 찾고 있습니다.

다음과 같이 모든 짝수 행을 모든 홀수 행의 시작 부분으로 이동하는 방법을 알아내려고 합니다.

앞으로:

AAA
BBB
CCC
DDD

뒤쪽에:

BBBAAA
DDDCCC

여러 파일을 동시에 실행할 수 있다면 매우 좋을 것입니다. cat을 사용하여 모든 파일을 결합하면 파일이 너무 커서 처리할 수 없게 되기 때문입니다. bash 파일에 추가할 수 있도록 텍스트 교환을 수행하는 다음 명령과 같습니다.

  find /directory/. -type f -exec sed -i 's/oldtext/newtext/g' {} \;

검색했지만 적합한 것을 찾지 못했습니다.

작업을 더 쉽게 하기 위해 다음과 같이 모든 홀수 줄의 시작 부분에 "string1"을 추가하고 모든 짝수 줄의 시작 부분에 "string2"를 추가할 수 있습니다.

  before:
  string1AAA
  string2BBB
  string1CCC
  string2DDD

  after:
  string2BBBstring1AAA
  string2DDDstring1CCC 

매우 감사합니다.

답변1

접두사가 붙은 아이디어는 잊어버리세요. 당신이 찾고있는 스크립트는

sed 'N;s/\(.*\)\n\(.*\)/\2\1/'

즉, 를 사용하여 다음 줄을 읽은 N다음 순서를 변경하고 줄 바꿈을 제거합니다.

find작성한 내용과 결합 할 수 있습니다 . 먼저 옵션 없이 시도해 보고 -i이것이 원하는 것인지 테스트해 보세요.

답변2

멍하니해결책:

for f in /directory/*; do gawk -i inplace '{getline nl; print nl$0}' "$f"; done

for f in /directory/*- 지정된 경로의 각 파일에 대해

gawk -i inplace- 할 수 있게 하다제자리에파일 편집

getline nl- awk의 입력에서 변수로 다음 레코드를 읽습니다 nl(다음 줄).

print nl$0- 현재 및 다음 교환 기록 인쇄

답변3

GNU 사용 sed:

sed '1~2 { h; d; }; G; s/\n//'

그리고 awk:

awk '{ if(NR%2) save = $0; else print $0 save }'

그리고 perl:

perl -pe '$_ = <> . $_; s/\n//'

답변4

eval "`echo 'NL=qsq' | tr 'qs' '\047\012'`"; # newline
set -- 
while IFS= read -r l; do
   case $# in
      0 ) set -- "$l" ;;
      * ) printf '%s%s\n' "$l" "$1"; set -- ;;
   esac
done < input.data
printf '%s' ${1+"$1$NL"} # to take care of dangling line

awk '{ if ( NR % 2 ) ORS = $0 RS; else print }' input.data

perl -lpe '$_ = (<>.$_) =~ s/\n//r' input.data

sed -ne '
   ${p;d;}
   h;n;G;s/\n//p
' input.data

결과

BBBAAA
DDDCCC

관련 정보