디렉터리의 파일을 연결하고 총 줄 수를 찾습니다.

디렉터리의 파일을 연결하고 총 줄 수를 찾습니다.

배쉬에서:

디렉터리의 모든 파일을 병합한 다음 하나의 명령을 사용하여 모든 줄의 총 개수를 계산하려고 합니다. |를 사용하여 두 명령을 모두 파이프할 수 있다는 것을 깨달았습니다.

! 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 -lcat

위의 각 명령줄은 두 개의 "파이프"를 포함하는 "명령 목록"으로 설명됩니다(실제 파이프는 포함되지 않음). 단일 "파이프라인"으로 수행하려면 다음을 수행하십시오.

$ 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된 후 파이프를 생성하지 않습니다 . 그래서 거기를 사용하는 것은 잘못되었습니다.catmergedfile.txtcatstdoutwc|

또는, 넌 할 수있어:

! 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

teestdin거기 에 넣고 mergedfile.txt복사해주세요 stdout.

관련 정보