3개의 중복된 줄 중 2개를 반대로 바꿉니다.

3개의 중복된 줄 중 2개를 반대로 바꿉니다.

이런 txt 파일이 있어요

AAAAAAAAAA
BBBBBBBBBB
CCCCCCCC

DDDDDDDDDDD
EEEEEEEEEEE
FFFFFFFFFFF

GGGGGGGGGGG
HHHHHHHHHHH
IIIIIIIIIII

각 그룹에는 3개의 줄이 있으며 사이에 줄바꿈이 있습니다.

파일이 다음과 같이 보이도록 각 그룹의 처음 두 줄을 뒤집고 싶습니다.

BBBBBBBBBB
AAAAAAAAAA
CCCCCCCC

EEEEEEEEEEE
DDDDDDDDDDD
FFFFFFFFFFF

HHHHHHHHHHH
GGGGGGGGGGG
IIIIIIIIIII

터미널에서 이 작업을 어떻게 수행합니까?

편집: 텍스트 파일의 예를 다음에 업로드했습니다.여기답변을 테스트해야 하는 경우.

답변1

$ cat -n ip.txt 
     1  AAAAAAAAAA
     2  BBBBBBBBBB
     3  CCCCCCCC
     4  
     5  DDDDDDDDDDD
     6  EEEEEEEEEEE
     7  FFFFFFFFFFF
     8  
     9  GGGGGGGGGGG
    10  HHHHHHHHHHH
    11  IIIIIIIIIII

고정된 형식이므로 그에 맞게 모듈로 연산자를 사용하십시오.

$ awk 'NR%4==1{s=$0; next} 1; NR%4==2{print s}' ip.txt
BBBBBBBBBB
AAAAAAAAAA
CCCCCCCC

EEEEEEEEEEE
DDDDDDDDDDD
FFFFFFFFFFF

HHHHHHHHHHH
GGGGGGGGGGG
IIIIIIIIIII


흥미로운 perl정규식 버전

perl -00 -pe 's/(\N+\n)(\N+\n)/$2$1/' ip.txt
  • -00awk와 유사한 단락 모드-v RS=
  • 그런 다음 처음 두 줄을 바꾸십시오.
    • 또한 사용 가능 (\N+\n)((?1))- 복잡한 정규식을 반복해야 하는 경우 유용합니다.

답변2

단방향 - GNU awk 사용:

gawk 'BEGIN{RS=""; OFS=FS="\n"} {tmp = $2; $2 = $1; $1 = tmp; ORS=RT} 1' file
BBBBBBBBBB
AAAAAAAAAA
CCCCCCCC

EEEEEEEEEEE
DDDDDDDDDDD
FFFFFFFFFFF

HHHHHHHHHHH
GGGGGGGGGGG
IIIIIIIIIII

답변3

sed -n 'h; n; G; N; p; n; p' input.txt

설명하다

sed대기 공간과 패턴 공간이라는 두 가지 작업 공간이 있습니다 . 그들은 두 개의 변수와 같습니다 - var_1var_2. 각 입력 라인은 패턴 공간으로 들어가지만 이를 복사(예약된 공간의 모든 항목 대체)하거나 예약된 공간에 추가할 수 있습니다. 그러므로:

  • h- 패턴 공간을 예약된 공간으로 복사합니다. 이제 패턴 공간과 홀드 공간은 모두 AAAAA.
  • n- 다음 입력 라인을 패턴 공간으로 가져옵니다. 따라서 패턴 공간은 이제 BBBBB.
  • G- 개행 문자와 keepspace( )의 내용을 AAAAA패턴 공간에 추가하여 패턴 공간이 현재 가 되도록 합니다 BBBBB\nAAAAA.
  • N- 패턴 공간에 개행 문자와 입력의 다음 줄을 추가합니다. -BBBBB\nAAAAA\nCCCCC
  • p- 패턴 공간을 인쇄합니다.
  • n- 패턴 공간에 대한 다음 입력 줄을 가져오고(존재하는 경우), 그렇지 않으면 종료합니다(파일 끝에 도달한 경우).
  • p- 패턴 공간을 다시 인쇄합니다.

산출

BBBBBBBBBB
AAAAAAAAAA
CCCCCCCC

EEEEEEEEEEE
DDDDDDDDDDD
FFFFFFFFFFF

HHHHHHHHHHH
GGGGGGGGGGG
IIIIIIIIIII

관련 정보