다른 파일을 기반으로 특정 순서를 사용하여 파일 연결

다른 파일을 기반으로 특정 순서를 사용하여 파일 연결

여러 파일을 다른 파일 내에서 특정 순서로 연결하고 싶습니다.

여러 개의 파일이 있는데 freq_<something>이를 연결하고 싶습니다. "something"은 "list"라는 다른 파일에 나열되어 있습니다.

내 목록은 다음과 같습니다.

$ cat list
003137F
002980F
002993F

나하고 싶어:

cat freq_003137F freq_002980F freq_002993F > freq_all

하지만 내 목록에는 수백 개의 값이 포함되어 있으므로 실제로는 그렇게 할 수 없습니다!

이것을 자동화할 수 있는 방법이 있나요? 로 파일을 첨부할 수 있을 줄 알았는데 while read line실패했어요...

감사해요!

중간 사이즈

답변1

사용xargs

xargs -i cat freq_'{}' < list > freq_all

답변2

를 사용하여 이 작업을 수행할 수 있습니다 while. 왜 안 됩니까? 이것은 작동합니다:

while read suffix; do cat freq_"${suffix}"; done < list > freq_all; done

또는 다음을 사용하여 명령을 생성 printf하고 수동으로 실행할 수 있습니다.

$ echo "cat $(printf 'freq_%s ' $(cat list)) > freq_out"
cat freq_003137F freq_002980F freq_002993F > freq_out

또는 직접 실행하십시오.

cat $(printf 'freq_%s ' $(cat list)) > freq_out

답변3

xargs를 사용하려는 경우 일반적으로 단일 프로세스의 명령줄에 여러 인수를 배치하는 기능을 활용하고 싶을 것입니다. (프로세스 시작 오버헤드가 주어지면 cat해당 매개변수를 반복하는 프로세스를 실행하는 것이 각 파일에 대해 별도의 프로세스를 실행하는 것보다 더 효율적입니다.)cat

xargs '-I{}' cat freq_'{}'불행하게도 이는 암시되어 -x -L 1있으며 명령당 여러 인수를 실행하기 위해 재정의하는 것을 거부합니다.

sed대신 에 교체를 사용할 수 있습니다 . 이거 하나쯤 있으면 좋을 것 같아매우@terdon의 답변에서 bash 명령을 printf로 바꾸기에는 너무 큰 목록입니다. xargs는 인수를 최대 128kiB(기본값)의 텍스트 덩어리로 일괄 처리하는 것을 알고 있습니다.

sed 's/^/freq_/' list | xargs -d'\n' cat   > freq_out

s/^/foo/줄의 시작 부분에 내용을 추가합니다. 이 패턴은 각 줄의 시작 부분에서 너비가 0과 일치합니다.

관련 정보