짧은 답변

짧은 답변

나는 일반적으로 unix/bash/code를 처음 사용하고 있으며 다른 디렉터리에 있는 동일한 이름을 가진 여러 예제 파일을 자체 디렉터리(여러 데이터 세트의 출력)에 있는 새 파일로 병합하려고 합니다.

이를 위해 listA(각 샘플 파일의 이름)와 list B(새로 병합된 샘플 파일의 이름)의 두 배열을 사용하는 스크립트를 만들어 보았습니다.

내 코드는 다음과 같습니다.

#!/bin/sh

listA=( old1 old2 old3 etc.)
listB=( new1 new2 new3 etc.)

i=0

for i in $listA $listB

do

cp ./folder1/$listA ./merged/$listB
cat ./folder2/$listA >> ./merged/$listB
cat ./folder3/$listA >> ./merged/$listB
cat ./folder4/$listA >> ./merged/$listB

((i=+1))

done
echo "Done stitching"

있는 그대로 listA의 첫 번째 항목에 대한 파일을 listB의 첫 번째 파일에 완벽하게 병합하는 것처럼 보이지만 목록의 후속 항목에 대한 프로세스를 반복하지는 않습니다.

이 작업을 예상대로 수행하기 위한 제안 사항이 있습니까? 저의 무지에 대해 사과드립니다. 저는 이 모든 것이 처음이고 학습 과정을 정말 즐기고 있습니다. 단지 약간 혼란스러울 뿐입니다.

답변1

짧은 답변

while IFS=$'\t' read -r old new; do cat folder*/"$old" > merged/"$new"; done <list.tsv

이는 list.tsv탭으로 구분된 소스(이전) 파일과 대상(새) 파일 목록을 가정합니다.

설명하다

  • while IFS=$'\t' read -r old new; FOO; done <list.tsvlist.tsv: 이것은 각 줄을 읽은 다음 FOO각 줄에서 작업을 수행하는 일반적인 셸 구성입니다 . 이 경우 입력 파일 구분 기호 IFS는 tab 입니다 $'\t'. 즉, 줄의 첫 번째 필드는 에 저장되고 $old두 번째 필드(탭 뒤)는 에 저장됩니다 $new.
  • cat folder*/"$old" > merged/"$new": 파일을 연결하여 folder*/"$old"씁니다 . 이는 merged/"$new"소스 파일이 모두 에 위치한다고 가정 합니다 folder*.folder1folder2
  • 다른 스크립트와 마찬가지로 실행하기 전에 반드시 테스트해 보겠습니다. 파일의 하위 집합을 다른 디렉터리에 복사한 다음 짧은 버전의 입력 목록을 사용하여 이를 수행할 수 있습니다 list.tsv. 결과를 확인하고, 가능하다면 실제로 실행해 보세요(그러나 백업을 유지하세요!).

제안된 솔루션에 대한 참고 사항

저는 다양한 명령이 어떻게 작동하는지 명확히 하기 위해 귀하가 제안한 솔루션에 대한 몇 가지 의견을 작성하고 싶었습니다. 이것이 귀하의 이해에 도움이 되기를 바랍니다!

  • listA=( old1 old2 old3 etc.). 그러면 배열이 생성됩니다. 일부 콘텐츠에 액세스하는 방법을 보여줍니다.여기. (어느 정도) 관찰했듯이 를 사용하면 for i in $listA…첫 번째 항목에만 액세스합니다.
  • for i in a b c. 이는 a, b및 를 반복하여 c각각을 에 넣습니다 $i. 예를 들어, 블록 내에서 참조하는 for i in a b c; do echo $i; done것은 $listA의미가 없습니다 do…done. 마찬가지로 i=0((i=+1))사용법도 일치하지 않습니다.for
  • ./folder1/$listA. ./불필요합니다. .은 현재 폴더이므로 여기서는 아무 작업도 수행하지 않습니다.
  • cat FOO >>. cat자체적으로 연결됩니다(따라서 이름). 파일에 추가된 별도의 명령문을 작성할 필요가 없습니다 cat. 예를 >>들어 뒤에 여러 파일을 나열할 수 있습니다 .catcat file1 file2 file3 > output_file

관련 정보