나는 일반적으로 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.tsv
list.tsv
: 이것은 각 줄을 읽은 다음FOO
각 줄에서 작업을 수행하는 일반적인 셸 구성입니다 . 이 경우 입력 파일 구분 기호IFS
는 tab 입니다$'\t'
. 즉, 줄의 첫 번째 필드는 에 저장되고$old
두 번째 필드(탭 뒤)는 에 저장됩니다$new
.cat folder*/"$old" > merged/"$new"
: 파일을 연결하여folder*/"$old"
씁니다 . 이는merged/"$new"
소스 파일이 모두 에 위치한다고 가정 합니다folder*
.folder1
folder2
- 다른 스크립트와 마찬가지로 실행하기 전에 반드시 테스트해 보겠습니다. 파일의 하위 집합을 다른 디렉터리에 복사한 다음 짧은 버전의 입력 목록을 사용하여 이를 수행할 수 있습니다
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
. 예를>>
들어 뒤에 여러 파일을 나열할 수 있습니다 .cat
cat file1 file2 file3 > output_file