*편집: 모든 출력을 파일에 추가하기로 결정했습니다.
편집할 CSV 파일이 40개 있습니다. 20 형식은 docA.csv, docB.csv 등과 같이 한 문자만 다른 이름과 일치합니다. 또 다른 20개도 pair_docA.csv, pair_docB.csv 등과 같은 이름으로 일치합니다.
docA.csv와 pair_docA.csv를 편집하고 결합하는 코드가 있는데, 위의 두 파일을 호출하여 편집한 다음 CombinedA.csv라는 이름으로 결합한 다음 다음으로 이동하는 루프를 작성하는 데 어려움을 겪고 있습니다. 다음 오른쪽.
누구든지 기본 bash 스크립트 작성을 도와줄 수 있나요? 이것이 내가 지금까지 가지고 있는 것입니다. 나는 하나의 for 루프를 시도했고 이제 2개(아마도 3개)의 for 루프를 시도하고 있습니다. 나는 그것을 반복적으로 유지하는 것을 선호합니다.
set -x
DIR=/path/to/file/location
for file in `ls $DIR/doc?.csv`
do
#code to edit the doc*.csv files ie $file
#output is called temp_doc*.csv
done
for pairdoc in `ls $DIR/pair_doc?.csv`
do
#code to edit the piar_doc*.csv files ie $pairdoc
#output is called temp_pair*.csv
done
#still need to combine the files. I have the join written for a single iteration,
#but how do I loop the code to save each join as a different file corresponding
#to combined*.csv
답변1
set -x
DIR=/path/to/file/location
TMPDIR=$(mktemp -d)
rm -f -- "$DIR/combined.csv"
for file in "$DIR"/doc?.csv
do
doc=${file##*/}
#------------ doc processing
temp_doc="$TMPDIR/$doc"
your_code "$file" > "$temp_doc"
#------------- pair doc processing
pair="$DIR/pair_$doc"
temp_pair="$TMPDIR/$pair"
your_code "$pair" > "$temp_pair"
#--------- combine doc+pair
combined="$DIR/combined${doc/doc/}"
your_code "$temp_doc" "$temp_pair" > "$combined"
cat "$combined" >> "$DIR/combined.csv"
done
참고: 위 세 단계의 처리 코드를 귀하의 처리 코드로 바꾸세요.
doc=${file##*/} 위 구조에서 수행하는 작업은 쉘 변수 $file에서 왼쪽부터 시작하여 마지막 / 별표를 제거하는 것뿐입니다. 헤더는 $DIR이라는 것을 기억하세요. 우리는 간단한 기본 이름을 취하고 결과를 다른 쉘 변수 $doc에 저장합니다.
모든 것을 하나의 파일로 연결하기 위해 마지막 cat 라인을 추가했습니다.
답변2
면책조항: 이는 결코 최선의 방법이나 어떤 관점에서든 최선의 방법은 아니지만 이러한 유형의 문제에 대해 생각하는 방법을 보여줍니다. 이와 같은 작업을 한 번만 수행하면 괜찮지만, 스크립트를 작성하는 사람이 아닌 다른 사람을 사용해서는 안 됩니다. 다른 사람이 사용하는 컴퓨터에 넣지 마세요. 기본 원칙은 대부분의 작업을 가장 작은 단계로 나눌 때 간단하다고 생각하는 것입니다.
이 게시물에 모든 반복을 보관했기 때문에 매우 간단한 변경으로 결과가 어떻게 바뀌는지 확인하고 비교할 수 있습니다. 입력 테스트를 시작해야 할 때 어려움이 발생하지만 해당 코드를 유용하게 만드는 코드가 없습니다. 다양한 파일 이름에 대한 입력 추가, 입력 매개변수에 대한 여러 검사 추가 등 다시 한 번 말씀드리지만, 이런 일을 한 번 하는 것은 괜찮지만, 반복되는 일에 대해 완전한 답변으로 사용해서는 안 됩니다.
#!/bin/bash
for n in $(ls -1 doc*.csv);
do
cat $n >> combinded$n
cat pair_$n >> combinded$n
mv combinded$n $(echo combinded$n | sed 's/doc//g')
done
docA.csv
이렇게 하면 이름이 지정된 파일을 가져 pair_docA.csv
와서 이름이 지정된 파일로 결합하여 combinedA.csv
원본 파일은 변경되지 않습니다. 동일한 명명 패턴을 따르는 디렉터리의 모든 파일에 대해 이 작업을 수행합니다.
참고: 이는 파일과 동일한 디렉터리에서 실행되어야 하며 파일 이름은 여기에 표시된 대로 지정되어야 합니다.
시험:
doc_A.csv doc_B.csv 대 _docA.csv 대 _docB.csv
산출:
조합 A.csv 조합 B.csv
편집: 모든 것을 파일로 출력하는 것에 대한 질문에 답하기 위해 다음과 같은 파일에 기록합니다.combinded.csv
#!/bin/bash
for n in $(ls -1 doc*.csv);
do
cat $n >> combinded.csv
cat pair_$n >> combinded.csv
done
이는 다음 형식의 파일로 출력됩니다.
- docA.csv
- piar_docA.csv
- docB.csv
- pair_docB.csv
등. 파일 끝까지.
편집: 입력 및 출력이 약간 어려워질 때 디렉터리를 추가하려면 매개 변수를 테스트해야 합니다. 이 스크립트는 두 개의 매개 변수를 사용합니다. 첫 번째 매개 변수는 파일이 포함된 디렉터리이고 두 번째 매개 변수는 출력 파일의 위치입니다. 매개변수는 필수입니다.
#!/bin/bash
dir=$1
out=$2
cd $1
for n in $(ls -1 doc*.csv);
do
cat $n >> combinded$n
cat pair_$n >> combinded$n
mv combinded$n $out/$(echo combinded$n | sed 's/doc//g')
done
예: ./script.sh /path/to/files /path/to/output
두 매개변수가 모두 필요합니다.