스케줄러에서 호출할 수 있도록 한 줄 명령을 스크립트로 변환하려고 합니다. 그러나 bash에서 실행하면 명령이 제대로 작동하지만 쉘 스크립트에서 실행하면 봇이 작동하지 않습니다.
$FILE1 파일에 다음 데이터가 있습니다.
1,Date,Country,Europe,6
2,Date,Country,America,22
3,Date,Country,America,22
4,Date,Country,Asia,9
5,Date,Country,Australia,29
예상되는 출력은 국가 이름과 20보다 큰 숫자, 그리고 고유한 값만 입력하는 것입니다. 예를 들면 다음과 같습니다.
America, 22 MILLION
Australia, 29 MILLION
내 코드는 다음과 같습니다. 고유한 값을 제공하는 대신 모든 중복 값을 제공합니다.
#This will only pull Country column i.e. America, Australia and so on...
grep "Country" FILE1|cut -f4 "," > $FILE2
#This will use the keyword America from FILE2 and search in FILE1 for associated count and copy in FILE3
for i in $(cat $FILE2);
do
cat $FILE1|grep "Country"|grep $i|echo $i, `wc -l` MILLION >> $FILE3;
done;
#Now that we have both country name and count...we will find countries only with >20 count
for a in $(cat $FILE3);
do
awk -F "," '$2 > 20' $FILE3 |sort -u > $FILE4
done;
#Send the final file to email
echo "Here is the data"|mailx -s "Population data" -a FILE4 user@email
두 번째 질문은 어떻게 하면 좋은 방식으로 형식을 지정할 수 있느냐는 것입니다. 예를 들어 "
America has more than 22 million population
Australia has more than 29 million population
바꾸다
America, 22 million
Australia, 29 million
감사해요. 기본적인 질문이라면 죄송합니다. 저는 이제 막 Unix 스크립트 작업을 시작했습니다.
답변1
전체 텍스트 처리 작업을 단일 awk
프로그램으로 결합할 수 있습니다.
awk -F',' '($5>20)&&(!seen[$4]++){printf "%s has more than %d million inhabitants\n",$4,$5}' data.csv
이는 파일을 CSV 파일로 구문 분석하고 5번째 필드를 검사하여 20보다 큰지 확인하고 내부 발생 카운터를 유지하여 seen
국가 이름이 아직 발견되지 않았는지 확인합니다. 두 조건이 모두 충족되는 경우에만 필드 4와 5의 정보를 조합하여 필수 문자열을 인쇄합니다.
이를 쉘 스크립트에 포함하려면 다음을 수행하십시오.
awk -F',' '($5>20)&&(!seen[$4]++){printf "%s has more than %d million inhabitants\n",$4,$5}' "$file1" > "$file4"
참고로 좋은 습관이에요아니요환경 변수로 내보내는 경우를 제외하고 쉘 변수 이름은 모두 대문자로 사용하고, 불필요한 토큰화를 방지하려면 쉘 변수를 올바르게 인용하십시오.
나는 그것을 조사해 볼 것을 제안한다.GreyCat&Lhunath의 배쉬 가이드쉘 스크립팅에 대한 추가 정보. 또한 설치를 고려하십시오.주택 검사, 이는 쉘 스크립트에서 많은 구문 오류를 잡는 데 도움이 됩니다.