다음 스크립트의 목적은 paste
명령을 통해 여러 테이블을 병합하고 특정 디렉터리에 배치하는 것입니다.
for i in {1..30}
do
paste ./directory"$i"/table1.txt table2.txt ... table20.txt > ./merged_tables/tables_directory"$i".txt
done
다음 오류가 발생합니다.
paste: file table2: No such file or directory
각 테이블에 경로를 작성하면 작동하지만 경로를 여러 번 작성하고 싶지 않습니다. 각 테이블에 경로를 작성하지 않고 이 작업을 수행할 수 있는 다른 방법이 있습니까? 미리 감사드립니다
답변1
for (( i = 1; i <= 30; ++i )); do
( cd "directory$i" &&
paste tableNC023.txt tableNC088.txt tableNC102.txt ... ) >"./merged_tables/tables_directory$i.txt"
done
cd
이는 서브쉘에 디렉토리를 입력하는 데 사용됩니다 . cd
성공 하면 paste
결합된 데이터를 생성하는 데 사용됩니다. 서브셸의 출력은 이전과 같이 결과 파일로 리디렉션됩니다.
서브셸에서 수행되므로 다음 반복을 위해 "뒤로" 돌아가 거나 할 cd
필요가 없습니다 .cd ..
cd -
cd "$OLDPWD"
더 깔끔한 코드를 위한 대안:
tables=( tableNC023.txt tableNC088.txt tableNC102.txt
more tables here )
for (( i = 1; i <= 30; ++i )); do
( cd "directory$i" &&
paste "${tables[@]}" ) >"./merged_tables/tables_directory$i.txt"
done
나는 순전히 개인적인 취향에 따라 for (( i ... ))
대신 사용합니다.for i in {...}
답변2
for i in {1..30}
do
pushd directory"$i" >/dev/null 2>&1 || continue
paste table1.txt table2.txt ... table20.txt > ../merged_tables/tables_directory"$i".txt
popd >/dev/null 2>&1
done
답변3
이미 중괄호 확장을 사용하고 있으므로 여기서도 사용할 수 있습니다.
..
확장 프로그램이 일련의 숫자( 리터럴) 를 생성하도록 하십시오 .
for i in {1..30}; do
paste ./directory"$i"/table{1..20}.txt > ./merged_tables/tables_directory"$i".txt
done
또는 수동으로 나열하십시오(채우기 ...
).
for i in {1..30}; do
paste ./directory"$i"/table{1,2,...,20}.txt > ./merged_tables/tables_directory"$i".txt
done
즉, 패턴과 일치하는 디렉토리의 모든 파일을 원하지 않는다고 가정합니다.
for i in {1..30}; do
paste ./directory"$i"/table*.txt > ./merged_tables/tables_directory"$i".txt
done