파일의 마지막 줄을 같은 파일의 두 번째 줄로 이동해야 합니다.

파일의 마지막 줄을 같은 파일의 두 번째 줄로 이동해야 합니다.

Linux에 다음 데이터가 포함된 "test" 파일이 있습니다.

aaaaaa
bbbbbb
cccccc
dddddd
eeeeee

파일의 마지막 줄을 잘라서 두 번째 위치에 넣어야 합니다. 아래와 같아야 합니다.

aaaaaa
eeeeee
bbbbbb
cccccc
dddddd

답변1

ed이 문제 는 기본적으로 스트림 프로세서가 아닌 스크립트 가능한 텍스트 편집기이기 때문에 실제로 를 사용하여 해결하는 것이 가장 쉬울 것입니다 . 예를 들어 ed,

# Create test file
~> printf "%s\n" aaaaaa bbbbbb cccccc dddddd eeeeee >test.txt
~> cat test.txt
aaaaaa
bbbbbb
cccccc
dddddd
eeeeee

# Use ed to open the file, move the last line after the first, save, and quit
~> printf "%s\n" '$m1' wq | ed test.txt
35
35
~> cat test.txt
aaaaaa
eeeeee
bbbbbb
cccccc
dddddd

답변2

버퍼 방법 유지:

sed '$x;1!H;1p;$!d;x;s/\n//
' <<\IN
aaaaaa
bbbbbb
cccccc
dddddd
eeeeee
IN

... 첫 번째 줄 H이 아닌 모든 줄이 변경되어 인쇄되는 첫 번째 줄이 됩니다. 마지막 줄 에서는 홀드 및 패턴 공간을 변경합니다.!p$x앞으로이는 H이전 작업(저장된 줄을 마지막 줄에 추가)을 수행한 다음 d출력에서 !​​마지막 줄 이 아닌 모든 줄을 제거합니다 $.

$마지막 줄 에서는 x공백을 다시 변경하여 s///첫 번째 \newline 문자(두 번째 줄에 추가된 추가 내용을 처리함)를 대체하고 자동으로 배치를 인쇄합니다.

산출:

aaaaaa
eeeeee
bbbbbb
cccccc
dddddd

고정 버퍼를 사용하지 않고:

cat <<\IN >infile
aaaaaa
bbbbbb
cccccc
dddddd
eeeeee
IN

...예제를 실제 파일에 저장하세요...

sed '1p;$!d;r infile' <infile | sed '3d;$d'

이는 첫 번째 줄만 인쇄하는 첫 번째 줄로 리디렉션된 <infile다음 출력 에서 sed​​마지막 줄 이 아닌 모든 줄을 제거합니다 . 마지막 줄은 자동으로 인쇄되지만 이는 최종 명령을 실행하는 유일한 줄이기도 합니다.stdinpd!$rinfile 다시도착하다 stdout. 이 모든 것이 |두 번째 파이프로 연결되고 sed출력 d에서 ​​세 번째이자 마지막 입력 행을 제거하면 재배열이 완료됩니다.

산출:

aaaaaa
eeeeee
bbbbbb
cccccc
dddddd

답변3

awk를 사용하는 간단한 방법:

~$ awk '{a[NR]=$0}END{print a[1];print a[NR];for(i=2;i<NR;i++){print a[i]}}' f
aaaaaa
eeeeee
bbbbbb
cccccc
dddddd

각 행을 배열에 저장 a한 다음 원하는 순서(첫 번째 행, 마지막 행( NR) 및 2부터 두 번째 행부터 마지막 ​​행까지)로 배열을 인쇄합니다.

head/tail과 sed의 조합을 사용하십시오:

~$ head -1 f;tail -1 f;sed '1d;$d' f
aaaaaa
eeeeee
bbbbbb
cccccc
dddddd

첫 번째와 마지막 줄을 인쇄한 다음 sed를 사용하여 첫 번째와 마지막 줄을 삭제합니다.


sed만 사용하면 이 명령만 찾을 수 있습니다. 더 좋은 방법이 있다고 확신합니다.

~$ sed '${p;x;s/^\n//;p};2,${H;d}' f
aaaaaa
eeeeee
bbbbbb
cccccc
dddddd

첫 번째 줄이면 인쇄합니다(기본값). 두 번째 줄부터 홀딩 버퍼( )
에 들어가고 패턴 공간( )에서 제거됩니다. 마지막 라인이라면 인쇄하고( ), 홀딩 버퍼를 가져와서( ), 빈 라인을 제거 하고( ) 인쇄합니다( ).Hdpxs/^\n//p

답변4

펄 사용:

perl -e 'my @lines = <>; print for @lines[0, $#lines, 1..$#lines-1]' file

awk 사용:

$ awk '
    {lines[NR]=$0}
    END{
        print lines[1], lines[NR];
        for (i=2; i<NR; i++) {print lines[i]}
    }
' OFS=$'\n' file

산출

aaaaaa
eeeeee
bbbbbb
cccccc
dddddd

관련 정보