2012-10-02 5 views
0

을 수정하는 것은 여기 내 스크립트입니다 :bash는 스크립트 파일

#!/bin/bash 


for i in *.csv 
do 
     echo "i: $i" 
     THE_FILE2="$i-2.csv" 

     file_read() 
     { 
       lineno=0 
       while read line 
       do 
         echo $line | awk -F, '{print $1","$2",,,"$3","$4}' 
         ((lineno++)) 
       done 
     } < $i > $THE_FILE2 
     echo "the_file2: $THE_FILE2" 
     echo "end" 
done 

file_read 

출력 :

i: 2992.csv 
the_file2: 2992.csv-2.csv 
end 
i: 5415.csv 
the_file2: 5415.csv-2.csv 
end 
i: csa.csv 
the_file2: csa.csv-2.csv 
end 
i: loc.csv 
the_file2: loc.csv-2.csv 
end 
i: visa.csv 
the_file2: visa.csv-2.csv 
end 

$ ls 
2992.csv  csa.csv  transform.sh visa.csv-2.csv 
5415.csv  loc.csv  visa.csv 

불행하게도, 그것은 단지 목록의 마지막 파일을 수행합니다. 다른 모든 것들을 건너 뛰고 있습니다. 나는 이것이 버퍼링이나 globbing 또는 무언가와 관련이 있다고 느낀다. 내가 뭘 놓치고 있니?

+1

왜 당신이 당신의 스크립트 라인으로 파일 라인을 읽고 : 여기

awk 솔루션입니다? Awk는 기본적으로 당신을 위해 그것을한다. $ 1, $ 2, $ 3, $ 4} $ i> $ THE_FILE2'는 아마 당신이 원하는 것입니다. (안된다) – Bernhard

답변

3

루프 내부에 file_read을 정의한 다음 외부에서 호출했습니다.

다른 방법으로 사용해야합니다.

일부 값을 매개 변수로 file_read에 전달할 수 있습니다.

+1

나는이 기능을 완전히 없애 버릴 것이다. 케이스. – Bernhard

+0

위의 예제에서, 이것은 아마도 좋은 해결책 일 것입니다. 코드를 너무 혼동하지 않고 인라인으로 유지할 수있을만큼 작습니다. – John3136

1

file_read 기능이 필요하지 않습니다. 그 코드를 for-loop에 직접두기 만하면됩니다.

또한 왜 쉘의 read 명령을 사용한 다음 각 행에 대해 새 awk 명령을 사용하는 이유는 무엇입니까? 전체 파일을 awk로 리디렉션 할 수 있으며, 각 행을 자동으로 읽습니다.

그리고 lineno이 증가하지만 아무 것도 사용하지 않습니다. 표시되지 않은 항목에 회선 번호가 필요한 경우 awk의 NR 변수를 사용할 수 있습니다.

for i in *.csv 
do 
     echo "i: $i" 
     THE_FILE2="$i-2.csv" 
     awk -F, '{print $1","$2",,,"$3","$4}' < $i > $THE_FILE2 
     echo "the_file2: $THE_FILE2" 
     echo "end" 
done 
1

불행히도, 목록의 마지막 파일에만 적용됩니다.

루프 이후에 한 번만 file_read (으)로 전화하기 때문입니다. 루프의 마지막 반복에서 변수 iTHE_FILE2이 남아 있기 때문에 마지막 파일에 대해서만 실행합니다.

awk -f - *.csv << 'EOD' 
BEGIN { OFS = FS = "," } 
{ 
    out = FILENAME "-2.csv" 
    print $1,$2,",",$3,$4 >> out 
} 
EOD