[linux] 유닉스-파일의 머리와 꼬리

txt 파일이 있다고 가정하면 파일의 상위 10 줄과 아래쪽 10 줄을 동시에 보는 명령은 무엇입니까?

즉, 파일 길이가 200 줄이면 1-10 행과 190-200 행을 한 번에 봅니다.



답변

간단하게 할 수 있습니다 :

(head; tail) < file.txt

그리고 어떤 이유로 파이프를 사용해야하는 경우 다음과 같이하십시오.

cat file.txt | (head; tail)

참고 : file.txt의 줄 수가 head의 기본 줄 + tail의 기본 줄보다 작 으면 중복 된 줄이 인쇄됩니다.


답변

ed 입니다 standard text editor

$ echo -e '1+10,$-10d\n%p' | ed -s file.txt


답변

순수 스트림 (예 : 명령 출력)의 경우 ‘tee’를 사용하여 스트림을 분기하고 하나의 스트림을 머리에, 하나의 스트림을 머리에 보냅니다. 이를 위해서는 bash (+ / dev / fd / N)의 ‘> (list)’기능을 사용해야합니다.

( COMMAND | tee /dev/fd/3 | head ) 3> >( tail )

또는 복잡한 리디렉션이있는 / dev / fd / N (또는 / dev / stderr) 및 서브 쉘 사용 :

( ( seq 1 100 | tee /dev/fd/2 | head 1>&3 ) 2>&1 | tail ) 3>&1
( ( seq 1 100 | tee /dev/stderr | head 1>&3 ) 2>&1 | tail ) 3>&1

(이들 중 어느 것도 csh 또는 tcsh에서 작동하지 않습니다.)

약간 더 나은 제어 기능을 갖춘 무언가를 위해 다음 perl 명령을 사용할 수 있습니다.

COMMAND | perl -e 'my $size = 10; my @buf = (); while (<>) { print if $. <= $size; push(@buf, $_); if ( @buf > $size ) { shift(@buf); } } print "------\n"; print @buf;'


답변

(sed -u 10q; echo ...; tail) < file.txt

(head;tail)테마의 또 다른 변형 이지만 작은 파일의 초기 버퍼 채우기 문제를 피하십시오.


답변

head -10 file.txt; tail -10 file.txt

그 외에는 자신의 프로그램 / 스크립트를 작성해야합니다.


답변

JF Sebastian의 의견을 바탕으로 :

cat file | { tee >(head >&3; cat >/dev/null) | tail; } 3>&1

이 방법으로 첫 번째 라인과 나머지 라인을 하나의 파이프에서 다르게 처리 할 수 ​​있으며 이는 CSV 데이터 작업에 유용합니다.

{ echo N; seq 3;} | { tee >(head -n1 | sed 's/$/*2/' >&3; cat >/dev/null) | tail -n+2 | awk '{print $1*2}'; } 3>&1
N * 2
2
4
6


답변

여기서 문제는 스트림 지향 프로그램이 파일의 길이를 미리 알지 못한다는 것입니다 (실제 스트림 인 경우 파일 길이가 없기 때문에).

같은 도구 tail 다음 인쇄 본 마지막 n 라인을 버퍼 및 스트림의 마지막 기다립니다.

단일 명령 으로이 작업을 수행하려면 (오프셋으로 작동하고 겹치는 경우 줄을 반복하지 않도록) 언급 한이 동작을 에뮬레이트해야합니다.

이 awk를보십시오 :

awk -v offset=10 '{ if (NR <= offset) print; else { a[NR] = $0; delete a[NR-offset] } } END { for (i=NR-offset+1; i<=NR; i++) print a[i] }' yourfile