표준 출력을 연결하여 테이블로 대체

표준 출력을 연결하여 테이블로 대체

내가 가지고 있다고 가정 해 봅시다 :

$ cat tmp1.txt
a
b
c

그 다음에

$ paste tmp1.txt <(tr '[:lower:]' '[:upper:]'<tmp1.txt)
a   A
b   B
c   C

위의 내용을 어떻게 수정할 수 있나요?

1/ tmp1.txt한 번만 전화했나요? (아마도 tee)

tmp1.txt2/ 터미널에서 콘텐츠를 제공합니다(명령 출력으로 생성된 것처럼). 이를 위해 이를 수정해 보았지만 그리 멀리 가지 못했습니다.

$ cat<< 'EOF' | tee >(tr '[:lower:]' '[:upper:]')
a
b
c
EOF

출력:

a
b
c
A
B
C

답변1

명명된 파이프를 사용하여 tee다음 사이의 데이터에 대한 추가 채널을 만듭니다 tr.

$ mkfifo pipe
$ tee pipe <file | paste - <( tr '[:lower:]' '[:upper:]' <pipe )
a       A
b       B
c       C

또는 (덜 좋지만) tr왼쪽 으로 이동하려면 다음을 수행합니다 |.

$ mkfifo pipe
$ tee >( tr '[:lower:]' '[:upper:]' >pipe ) <file | paste - pipe

tr변환할 데이터를 제공하려면 명명된 파이프가 추가로 필요합니다 paste. 이 paste유틸리티는 원시 데이터와 변환된 데이터라는 두 가지 스트림을 읽어야 합니다. 그 중 하나는 표준 스트림일 수 있고, 다른 하나는 위에 표시된 대로 원본 파일(파일을 두 번째로 읽기) 또는 명명된 파이프에서 가져와야 합니다.

답변2

간단한 해결책은 다음과 같습니다.

awk ' { print $0 , toupper($0) ; } ' /tmp/tmp1.txt

또는

( echo a ; echo b ; echo c ;  ) | awk ' { print $0 , toupper($0) ; } '

또는 명명된 파이프나 FIFO를 사용하세요.

( echo a ; echo b ; echo c ) |
(
  D=$(mktemp -d) ;
  (
    cd $D ;
    mkfifo fifo_a fifo_b ;
    paste fifo_b <( tr '[:lower:]' '[:upper:]' < fifo_a ) &
    tee  fifo_a  > fifo_b  ;
    wait ;
    rm fifo_a fifo_b
  ) ;
  rmdir $D
)

관련 정보