파일의 첫 번째와 마지막 비어 있지 않은(또는 공백이 아닌) 줄을 인쇄합니다.

파일의 첫 번째와 마지막 비어 있지 않은(또는 공백이 아닌) 줄을 인쇄합니다.

파일에서 비어 있지 않거나 공백이 아닌 첫 번째 및 마지막 줄을 인쇄하고 싶습니다. 가급적이면 sed또는 을 사용하십시오 awk.

  • 입력 파일:
    123 345
    456 087
    er 56
    32 78
    
    
    그 뒤에는 빈 줄이 있습니다 32 78.
  • 원하는 출력:
    123 345
    32 78
    

답변1

질문의 텍스트가 수정되었기 때문에 여기서 두 질문에 모두 답변하고 있습니다.

  1. 파일의 첫 번째 줄과 두 번째 줄을 어떻게 출력합니까(원래 질문에는 "두 번째 줄"이라는 용어가 포함되어 있음)?

  2. null이 아닌 공백이 아닌 첫 번째 및 마지막 줄을 어떻게 출력합니까?


편집기를 사용하면 ed줄 주소 지정 비율이 약간 더 유연해집니다 sed. 이는 주로 한 번에 한 줄 대신 모든 데이터를 메모리로 읽어오기 때문입니다.

$ printf '%s\n' 1p '$-1p' Q | ed -s file
123 345
32 78

종료하기 전에 입력 파일의 첫 번째 줄과 두 번째 줄부터 마지막 ​​줄까지 인쇄됩니다. 두 번째 줄은 주소 지정에 사용되며 $-1로 단축될 수 있습니다 $-.

끝에 빈 줄이 있는지 모른다면, 1번 줄부터 거꾸로 검색하여 내용이 포함된 줄을 찾아 인쇄할 수 있습니다.

$ printf '%s\n' 1p '?[[:graph:]]?p' Q | ed -s file
123 345
32 78

사용 sed:

$ sed -n -e 1p -e '${ g; p; }' -e h file
123 345
32 78

이것은 먼저 각 라인의 기본 출력을 끕니다 -n. 그런 다음 첫 번째 줄을 인쇄합니다. 모든 줄은 save to Reserved space 를 사용하고 h, 마지막 줄에서는 g이를 사용하여 예약된 공간을 얻어서 인쇄합니다. 마지막 두 표현식의 순서로 인해 두 번째부터 마지막 ​​줄까지 인쇄됩니다.

약간만 수정하면 두 번째 줄인지 여부에 관계없이 비어 있지 않은 마지막 줄을 출력하도록 변경할 수 있습니다.

$ sed -n -e 1p -e '/[[:graph:]]/h' -e '${ g; p; }' file
123 345
32 78

grep및 조합을 사용하면 sed먼저 비어 있거나 비어 있는 것처럼 보이는 모든 줄을 필터링한 다음 첫 번째 줄과 마지막 줄만 출력할 수 있습니다.

$ grep '[[:graph:]]' file | sed -n -e 1p -e '$p'
123 345
32 78

원본 데이터의 첫 번째 행이 아니더라도 비어 있지 않은 첫 번째 행도 출력됩니다.

답변2

다음 awk프로그램이 이 작업을 수행합니다.

awk 'NF{last=$0; if (!c++) print;} END {if (c>1) print last}' file.txt
  • awk기본적으로 입력 줄은 연속된 공백과 탭인 "빈" 필드로 분할됩니다. 필드 수는 에 저장됩니다 NF. 줄이 완전히 비어 있거나 공백으로만 구성된 경우 NF0입니다 .
  • 프로그램이 실제로 시각적으로 비어 있지 않은 줄, 즉 NF0이 아니고 로 평가되는 줄 을 발견하면 true줄 내용을 버퍼에 저장합니다 last. 이것이 첫 번째 줄인 경우(counter 변수는 c설정되지 않고 계산됨 false) 현재 줄을 인쇄합니다. 어쨌든 증가하므로 c이는 비어 있지 않은 첫 번째 행에 대해 한 번만 발생할 수 있습니다.
  • last마지막으로 비어 있지 않은 마지막 줄의 내용을 인쇄하면 ,제공되는c>1, 비어 있지 않은 줄이 하나만 있는 경우 해당 줄은 한 번만 인쇄됩니다. 모든 행이 비어 있으면 c0으로 평가되고 절에도 아무것도 인쇄되지 않습니다 END.

답변3

sed -n '/^$/d; p; :a; n; /^$/!h; $!ba; g; /^$/!p' file.txt

테스트 파일 내용:

==> file_1.txt <==
123 345
456 087

er 56

32 78

==> file_2.txt <==    

123 345
456 087

er 56

32 78    

==> file_3.txt <==
123 345
456 087

er 56

32 78
==> file_4.txt <==


123 345
456 087

er 56

32 78  


==> file_5.txt <==
123 345

시험

for f in file_{1..5}.txt; do
    echo "==> $f <=="
    sed -n '/^$/d; p; :a; n; /^$/!h; $!ba; g; /^$/!p' "$f"
done

산출:

==> file_1.txt <==
123 345
32 78
==> file_2.txt <==
123 345
32 78
==> file_3.txt <==
123 345
32 78
==> file_4.txt <==
123 345
32 78
==> file_5.txt <==
123 345

관련 정보