하나의 명령에서 다른 두 명령으로 파이프 출력

하나의 명령에서 다른 두 명령으로 파이프 출력

한 명령의 출력을 다른 두 명령으로 파이프해야 합니다.

cat filename.txt | tail -n 1
cat filename.txt | wc -l

파일이 크기 때문에 두 번 읽는 것을 피하고 싶습니다. 명령을 확인했지만 tee원하지 않는 파일로 출력이 리디렉션됩니다. 관련 게시물은 많지만 관련 내용이 발견되지 않았습니다.

답변1

내가 올바르게 이해했다면 줄 번호와 함께 파일의 마지막 줄을 얻고 싶습니다.

$ cat a
aaa
bb
ccc
$
$ awk 'END{print $0; print NR}' a
ccc
3

변수에 저장해야 하기 때문에:

$ out=$(awk 'END{print $0"|"NR}' a)
$ last_line=$(echo $out | awk -F"|" '{print $1}' )
$ tot_cnt=$(echo $out | awk -F"|" '{print $2}' )
$ echo $last_line
ccc
$ echo $tot_cnt
3

답변2

{   
    {   tee /dev/fd/3 | wc -l >&4
    }   3>&1 | tail -n1
}   <filename.txt 4>&1

두 번 읽는 것을 피할 수는 없지만 멀티 코어 시스템에서는 동시에 읽을 수 있습니다. 그러나 출력 순서에 대한 보장은 없습니다.

그러나 아마도 귀하가 요구하는 것을 시뮬레이션하는 가장 빠른 방법은 다음과 같습니다.

dd bs=64k <filename.txt | tail -n1

dd읽기/쓰기를 stderr에 보고하고아직모든 파일을 표준 출력으로 복사합니다.

답변3

자러 가세요 cat. 필요하지 않습니다.

사용:

tail -n 1 filename.txt
wc -l filename.txt

관련 정보