여러 텍스트 파일에서 줄을 이동하는 방법은 무엇입니까? [복사]

여러 텍스트 파일에서 줄을 이동하는 방법은 무엇입니까? [복사]

안녕하세요, 다음과 같은 파일이 있다고 가정해 보겠습니다.

x
x
x
A
B
C
1
2
3
D
E
F
x
x
x

파일은 다음과 같아야 합니다.

x
x
x
A
B
C
D
E
F
1
2
3
x
x
x

몇 개의 행으로 이 작업을 수행 할 수 있다는 것을 알고 있지만 숫자를 어느 방향으로든 행을 이동 sed -i s/search/replace/g하는 더 좋고 쉬운 방법이 있는지 궁금합니다 .xy

답변1

편집하다

echo -e '7,9m12\n,p' | ed -s file.txt

답변2

다음을 사용하세요 sed(스트림 편집기에서 가장 쉬운 방법이므로 줄을 아래로 이동하세요).

$ sed '7,9{H;d;}; 12{G;s/\n//;}' <file
x
x
x
A
B
C
D
E
F
1
2
3
x
x
x

sed이 스크립트를 "12행 다음에 7~9행 이동"으로 해석 할 수 있습니다 .

스크립트 주석은 다음과 같습니다.

7,9{            # These are the lines we'd like to move
    H;          # Append them to the hold space (separated by newlines)
    d;          # Delete from pattern space, start next cycle
}
12{             # This is where we'd like to move those lines
    G;          # Append the hold space
    s/\n//;     # Remove the newline that the above command inserted
}
                # (implicit print)

줄은 줄 번호뿐만 아니라 정규식으로 처리될 수 있으므로 다음도 작동합니다(이 특정 데이터의 경우).

sed '/^1/,/^3/{H;d;}; /^F/{G;s/\n//;}' <file

즉, "로 시작하는 줄에서 시작하는 줄로 이동하고 "로 시작하는 줄 다음으로 1이동합니다 .3F


위 내용을 다음과 같이 직접 번역하세요 awk.

awk '/^1/,/^3/ { hold = hold ORS $0; next }
     /^F/      { $0 = $0 hold }
               { print }' <file

"줄 번호"(레코드 번호 awk) 사용:

awk 'NR == 7, NR == 9 { hold = hold ORS $0; next }
     NR == 12         { $0 = $0 hold }
                      { print }' <file

조건은 NR == 7, NR == 9다음과 같이 쓸 수도 있습니다 NR >= 7 && NR <= 9.

코드 에 100% 일치하려면 sed두 번째 청크를 읽어야 { $0 = $0 ORS hold; sub(ORS, "", $0) }하지만 출력 레코드 구분 기호(기본적으로 개행)를 삽입한 다음 즉시 제거하는 것은 약간 어리석은 일입니다.


원본 파일을 위 명령의 결과로 바꾸려면 다음을 수행하십시오.

sed ...as above... <file >newfile && mv newfile file

또는 command 와 동일합니다 awk.

sed/에 대한 입력 파일을 awk읽을 수 없거나 출력 파일을 쓸 수 없는 경우 원본 파일은 변경되지 않습니다.

관련 정보