2011-08-12 3 views
2

와 이름 공간에 파일을 구문 분석하는 방법 :은 내가 데이터베이스 삽입을위한 구성 요소로 파일 이름을 분할하는 스크립트를 만들었습니다 어떻게 awk는

find . -name "R*VER" | while read fname 
do 
    awk -v squote="'" -v base=${fname##*/} ' 
     { 
      split(base, a, "~");   
      printf("INSERT INTO REPORT (COL1,COL2,COL3,COL4,COL5,COL6,COL7,COL8)\n"); 
      str = sprintf("VALUES (\"%s\",\"%s\",\"%s\",\"%s\",\"%s\",\"%s\",\"%s\",\"%s\")", base, a[1], a[2], a[3], a[7], a[8], a[9], a[10]); 
      gsub("\"", squote, str);   # replace double quotes with singles 
      print str; 
     }' 
done 

그것은 오늘날까지 큰했다. 새 파일 이름은 a[1]에 공백이 포함 된 곳을 입력했습니다 (예 : something here~...).

지금, 나는 다음과 같이 파일의 혼합이 : 나는 find . -name "* *"find . -name "R*VER"에서 find을 수정할

R1~blah~blahblah...VERR 4~blah~blahblah...VER

을하지만이 파일 이름에 공백없이 모든 파일을 제외합니다 .

가장 효율적인 방법은 무엇입니까?

+0

awk-script를 별도의 파일에 넣고'find를 사용하십시오. -name ... -exec database_insert.sh {} \;' –

+0

이것이 왜 문제인지 이해가되지 않습니다. 공백이있는 이름을 제외 하시겠습니까? 공백을 제거 하시겠습니까? –

답변

2

오히려 공간보다, 줄 바꿈 때문에, Internal Field Separtor variable, $IFS을 설정합니다. 예 :

#!/bin/sh 
filenames=`ls` 
IFS=$'\n' 
for fname in $filenames ; do 
    echo "$fname: " 
    awk '{print $0}' $fname 
done 
+0

Worked. 고맙습니다. – Chris

0

무엇처럼 명령 행에 변수를 둘러싸는 약 :하지만, 코드에서 추가적인 ##*/가 무엇을 알고하지 마십시오

awk ... base="$fname"

. 당신이 그것을 확인 확신한다면 아마 일부 bash는 확장 ... 는 너무 큰 따옴표로 모두 둘러싸 :

base="${fname##*/}"

+0

글쎄, 나는'base = $ {fname ## * /}'을 사용하여 path + 디렉토리 이름을 제거했다. – Chris

+0

Re $ {param ## text} : http://www.gnu.org/software/bash/manual/bashref.html#Shell-Parameter-Expansion- GNU bash에서 매우 유용한 도구입니다. –

+0

@Chris, ok, 그래서'base = "$ {fname ## * /}"시도해보십시오. – TMS

관련 문제