배쉬에서:
디렉터리의 모든 파일을 병합한 다음 하나의 명령을 사용하여 모든 줄의 총 개수를 계산하려고 합니다. |를 사용하여 두 명령을 모두 파이프할 수 있다는 것을 깨달았습니다.
! cat /data/files *.txt >> mergedfile.txt | wc -l ~/data/files/mergedfile.txt
그러나 이것은 작동하지 않는 것 같습니다. 저는 bash를 사용하고 iPython에서 실행하고 있습니다(따라서!).
답변1
귀하의 질문은 약간 혼란스럽습니다.
!
쉘 프롬프트를 나타내는 데 사용합니까 ? 이것은 매우 이례적입니다..txt
디렉토리 의 모든 파일 에 대해 이야기하고 있습니까/data/files
? 이렇게 하려면 이라고 말해야 합니다/data/files/*.txt
. 다른 뜻이 있다면/data/files *.txt
설명해 주세요.>> mergedfile.txt
~ 할 것이다추가의mergedfile.txt
이미 존재하는 경우 파일을 삭제하세요 . 너가 원하는게 그거야? 비슷한 것을 원한다면 질문에 그렇게 말해야 합니다.
아무튼 말한대로댓글의 화살표를 통해, 간단하고 확실한 해결책은 다음과 같이 |
로 바꾸는 것입니다 ;
.
$ cat /data/files/*.txt >> mergedfile.txt; wc -l mergedfile.txt
노트:
- 위에서 말했듯이 파일이 이미 존재한다면
>>
추가하세요.mergedfile.txt
이전 콘텐츠를 무시(폐기)하려면 대신 을mergedfile.txt
사용하세요 .>
>>
- 동일한 파일을 여러 번 참조하는 경우 매번 동일한 방식으로 수행해야 합니다. 한 번은 상대 경로 이름을 사용하고 다음에는 절대 경로 이름을 사용하면 혼란스럽고 오류가 발생하기 쉽습니다. (파일 이름을 변수에 할당하여 작업을 단순화할 수 있습니다.)
위 내용을 바탕으로 약간의 개선 사항은 다음과 같습니다.
$ cat /data/files/*.txt > mergedfile.txt && wc -l mergedfile.txt
&&
로 바꾸십시오 . 그러면 명령이 성공한 경우에만 실행 ;
됩니다 .wc -l
cat
위의 각 명령줄은 두 개의 "파이프"를 포함하는 "명령 목록"으로 설명됩니다(실제 파이프는 포함되지 않음). 단일 "파이프라인"으로 수행하려면 다음을 수행하십시오.
$ cat /data/files/*.txt | tee mergedfile.txt | wc -l
행 개수 계산파일을 연결할 때,
출력 파일을 읽을 필요가 없습니다. 기존 항목에 추가하려면 mergedfile.txt
를 사용하십시오 tee -a
.
답변2
그것은해야한다:
! cat /data/files/*.txt >> mergedfile.txt && wc -l /data/files/mergedfile.txt
귀하의 명령은 두 가지 명령으로 구성됩니다. 첫 번째는 cat
출력을 텍스트 파일로 리디렉션하는 것입니다. 두 번째는 결과 파일의 길이를 계산하는 것입니다.
첫 번째 명령이 성공하면 두 명령을 순서대로 실행해야 합니다. 그러니 그냥 &&
체인을 사용하세요. 이 명령은 로 리디렉션 stdout
된 후 파이프를 생성하지 않습니다 . 그래서 거기를 사용하는 것은 잘못되었습니다.cat
mergedfile.txt
cat
stdout
wc
|
또는, 넌 할 수있어:
! cat /data/files/*.txt | wc -l
이는 더 간결하며 임시 파일을 사용하지 않습니다. 여기의 출력은 카운트 cat
에 직접 전송됩니다 .wc
노트, 임시 파일을 사용하는 첫 번째 방법에는 많은 단점이 있습니다.
mergedfile.txt
실행하기 전에 파일을 지워야 합니다 . 시작할 때 작업 디렉터리에 파일이 없어도 괜찮습니다. 그러나 일부 명령을 먼저 시도한 후(예: 잘못된 명령 사용) 임시 파일을 비우고 올바른 명령을 실행하는 것을 잊어버리는 경우가 매우 일반적입니다. 여전히 잘못된 답변으로 이어집니다. 실제로 모든 행이 에 있으면 간단히 대신 를/data/files/*.txt
사용할 수 있습니다 . 먼저 파일을 지웁니다.>
>>
- 임시 파일은 명령 실행 중에 다른 사용자가 변경할 수도 있고 일부 작업을 병렬로 수행하려는 경우 직접 변경할 수도 있습니다.
또한:나중에 사용해야 하는 경우 mergedfile.txt
다음 명령을 사용하여 tee
출력을 복사할 수 있습니다.
! cat /data/files/*.txt | tee mergedfile.txt | wc -l
tee
stdin
거기 에 넣고 mergedfile.txt
복사해주세요 stdout
.