내가 가지고 있다고 가정 해 봅시다 :
$ 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.txt
2/ 터미널에서 콘텐츠를 제공합니다(명령 출력으로 생성된 것처럼). 이를 위해 이를 수정해 보았지만 그리 멀리 가지 못했습니다.
$ 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
)