txt 파일이 있다고 가정하면 파일의 상위 10 줄과 아래쪽 10 줄을 동시에 보는 명령은 무엇입니까?
즉, 파일 길이가 200 줄이면 1-10 행과 190-200 행을 한 번에 봅니다.
txt 파일이 있다고 가정하면 파일의 상위 10 줄과 아래쪽 10 줄을 동시에 보는 명령은 무엇입니까?
즉, 파일 길이가 200 줄이면 1-10 행과 190-200 행을 한 번에 봅니다.
답변:
간단하게 할 수 있습니다 :
(head; tail) < file.txt
그리고 어떤 이유로 파이프를 사용해야하는 경우 다음과 같이하십시오.
cat file.txt | (head; tail)
참고 : file.txt의 줄 수가 head의 기본 줄 + tail의 기본 줄보다 작 으면 중복 된 줄이 인쇄됩니다.
head
의 처음 10 줄을 소비했습니다. ( head < file.txt; tail < file.txt
20 줄 미만의 파일에서 이것을 비교하십시오 ). 명심해야 할 사소한 점입니다. (그러나 여전히 +1)
head
만 표시 하지만 10 번째 라인 끝을 찾기 위해 더 많은 소비를 하지 않았다는 보장은 없으며 , 입력에 대한 입력을 less
줄입니다.
seq 100 | (head; tail)
처음 10 개의 숫자 만 제공합니다. 더 큰 입력 크기 (예 :)에서만 seq 2000
꼬리가 입력을받습니다.
순수 스트림 (예 : 명령 출력)의 경우 '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;'
COMMAND | { tee >(head >&2) | tail; } |& other_commands
cat >/dev/null
수정 :COMMAND | { tee >(head >&2; cat >/dev/null) | tail; } |& other_commands
head
및 tail
명령 : \ ...
head -10 file.txt; tail -10 file.txt
그 외에는 자신의 프로그램 / 스크립트를 작성해야합니다.
cat
및 head
또는 tail
내가 개별적으로 사용할 수 있다는 것을 알고, 좋은 파이프!
{ head file; tail file; } | prog
(필요한 괄호 안에 간격 및 후행 세미콜론)
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
a.out | awk -v ...
이 솔루션으로 끝나는 데 많은 시간이 걸렸으며 지금까지 모든 사용 사례를 다루는 유일한 솔루션 인 것 같습니다.
command | tee full.log | stdbuf -i0 -o0 -e0 awk -v offset=${MAX_LINES:-200} \
'{
if (NR <= offset) print;
else {
a[NR] = $0;
delete a[NR-offset];
printf "." > "/dev/stderr"
}
}
END {
print "" > "/dev/stderr";
for(i=NR-offset+1 > offset ? NR-offset+1: offset+1 ;i<=NR;i++)
{ print a[i]}
}'
기능 목록 :
나는이 솔루션을 잠시 동안 찾고있다. sed로 직접 시도했지만 파일 / 스트림의 길이를 미리 알지 못하는 문제는 극복 할 수 없었습니다. 위에서 사용 가능한 모든 옵션 중에서 Camille Goudeseune의 awk 솔루션이 마음에 듭니다. 그는 솔루션이 충분히 작은 데이터 세트로 출력에 여분의 빈 줄을 남겼 음을 기록했습니다. 여기에 여분의 라인을 제거하는 솔루션의 수정 사항이 있습니다.
headtail() { awk -v offset="$1" '{ if (NR <= offset) print; else { a[NR] = $0; delete a[NR-offset] } } END { a_count=0; for (i in a) {a_count++}; for (i=NR-a_count+1; i<=NR; i++) print a[i] }' ; }
file.ext의 처음 10 행, 마지막 10 행 :
cat file.ext | head -10 && cat file.ext | tail -10
파일의 마지막 10 줄, 첫 10 줄 :
cat file.ext | tail -10 && cat file.ext | head -10
그런 다음 다른 곳에서도 출력을 파이프 할 수 있습니다.
(cat file.ext | head -10 && cat file.ext | tail -10 ) | your_program
tail
및 head
별칭 - 보내고 그것을 또는 기능을.
https://gist.github.com/garyvdm/9970522 : 간단한 파이썬 앱을 작성했습니다.
파일뿐만 아니라 파이프 (스트림)도 처리합니다.
파일뿐만 아니라 파이프 (스트림)를 처리하려면 .bashrc 또는 .profile 파일에 추가하십시오.
headtail() { awk -v offset="$1" '{ if (NR <= offset) print; else { a[NR] = $0; delete a[NR-offset] } } END { for (i=NR-offset+1; i<=NR; i++) print a[i] }' ; }
그럼 당신은 할 수 없습니다
headtail 10 < file.txt
뿐만 아니라
a.out | headtail 10
(이것은 평범한 이전과 달리 10이 입력 길이를 초과 할 때 가짜 빈 줄을 계속 추가합니다. a.out | (head; tail)
합니다. 이전 답변자에게 감사합니다.)
참고 : headtail 10
아닙니다 headtail -10
.
파일의 처음 10 행과 마지막 10 행을 인쇄하려면 다음을 시도하십시오.
cat <(head -n10 file.txt) <(tail -n10 file.txt) | less
sed -n "1,10p; $(( $(wc -l ${aFile} | grep -oE "^[[:digit:]]+")-9 )),\$p" "${aFile}"
참고 : aFile 변수에는 파일의 전체 경로가 포함 됩니다.
파일 크기에 따라 내용을 적극적으로 읽는 것이 바람직하지 않을 수 있습니다. 그런 상황에서 간단한 쉘 스크립팅으로 충분하다고 생각합니다.
최근에 내가 분석하고있는 많은 대용량 CSV 파일에 대해 이것을 처리 한 방법은 다음과 같습니다.
$ for file in *.csv; do echo "### ${file}" && head ${file} && echo ... && tail ${file} && echo; done
그러면 각 파일의 처음 10 줄과 마지막 10 줄이 인쇄되고 파일 이름과 줄임표가 앞뒤에 인쇄됩니다.
하나의 큰 파일의 경우 동일한 효과를 위해 다음을 실행할 수 있습니다.
$ head somefile.csv && echo ... && tail somefile.csv