파일에서 비어 있지 않거나 공백이 아닌 첫 번째 및 마지막 줄을 인쇄하고 싶습니다. 가급적이면 sed
또는 을 사용하십시오 awk
.
- 입력 파일:
그 뒤에는 빈 줄이 있습니다123 345 456 087 er 56 32 78
32 78
. - 원하는 출력:
123 345 32 78
답변1
질문의 텍스트가 수정되었기 때문에 여기서 두 질문에 모두 답변하고 있습니다.
파일의 첫 번째 줄과 두 번째 줄을 어떻게 출력합니까(원래 질문에는 "두 번째 줄"이라는 용어가 포함되어 있음)?
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
. 줄이 완전히 비어 있거나 공백으로만 구성된 경우NF
0입니다 .- 프로그램이 실제로 시각적으로 비어 있지 않은 줄, 즉
NF
0이 아니고 로 평가되는 줄 을 발견하면true
줄 내용을 버퍼에 저장합니다last
. 이것이 첫 번째 줄인 경우(counter 변수는c
설정되지 않고 계산됨false
) 현재 줄을 인쇄합니다. 어쨌든 증가하므로c
이는 비어 있지 않은 첫 번째 행에 대해 한 번만 발생할 수 있습니다. last
마지막으로 비어 있지 않은 마지막 줄의 내용을 인쇄하면 ,제공되는c>1
, 비어 있지 않은 줄이 하나만 있는 경우 해당 줄은 한 번만 인쇄됩니다. 모든 행이 비어 있으면c
0으로 평가되고 절에도 아무것도 인쇄되지 않습니다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