명령줄 인수의 일부로 두 파일 결합

명령줄 인수의 일부로 두 파일 결합

csvgrep(csvkit의 일부)을 사용하여 두 파일 중 하나와 일치하는 줄을 추출하려고 합니다. 불행하게도 grep처럼 두 개의 일치하는 파일을 허용하는 명령줄 옵션은 없습니다. 오직,

csvgrep -f list1.txt -c 2 myfile.csv

명령의 일부로 list1.txt를 list2.txt와 연결하는 방법이 있습니까?

csvgrep -f (list1.txt+list2.txt) -c 2 myfile.csv

제가 생각할 수 있는 유일한 방법은 임시 중간 파일을 사용하는 것인데 가능하다면 그렇게 하지 않는 편이 낫습니다.

답변1

읽을 때 두 파일의 내용을 모두 제공하는 "파일 이름"을 명령에서 확인한 다음 교체를 처리하고 cat원하는 내용을 지정한다고 가정합니다.

csvgrep -f <(cat list1.txt list2.txt) -c 2 myfile.csv

기본적으로 프로세스 교체는 내부적으로 명령을 실행하고 해당 출력이 일반 파일처럼 열 수 있는 매직 파일을 통해 제공되도록 준비하는 일반 파이프입니다. 확장자 자체는 매직 파일의 이름으로 확장됩니다. (즉 , , print 와 echo <(echo foo)같은 것을 인쇄합니다 .)/dev/fd/63cat <(echo foo)foo

답변2

많은 프로그램에서는 -표준 입력 또는 출력을 나타내는 파일 이름으로 사용할 수 있습니다(입력 파일인지 출력 파일인지에 따라 다름). 따라서 파이핑 csvgrep하고 사용해 볼 수 있습니다 -f -.

cat list1.txt list2.txt | csvgrep -f - -c 2 myfile.csv

작동한다면 쉘별 확장에 의존하지 않기 때문에 프로세스 교체 방법에 비해 이점이 있습니다.

그래도 작동하지 않으면 를 사용할 수 있습니다 /dev/stdin. 이는 프로세스의 표준 입력을 자동으로 참조하는 표준 Linux 장치입니다.

출력이 파이프를 통해 전송되므로 이러한 모든 솔루션은 파일 조회가 csvgrep필요하지 않습니다 . 그러나 그것은 안전한 가정처럼 보입니다.-fcat

관련 정보