2012-10-05 2 views
1

awk 변수 필드를 여러 필드로 한 번에 설정하려고합니다.한 번에 여러 필드를 awk 변수로 설정

지금은 변수를 하나씩 설정할 수 있습니다.

for line in `cat file.txt`;do 
    var1=`echo $line | awk -F, '{print $1}'` 
    var2=`echo $line | awk -F, '{print $2}'` 
    var3=`echo $line | awk -F, '{print $3}'` 

    #Some complex code.... 
done 

나는 이것이 리눅스 변수를 여러 번 분석하기 때문에 값 비싼 원인이라고 생각합니다. 한 번에 변수를 설정하는 특별한 구문이 있습니까? awk에 BEGIN과 END 블록이 있지만 BEGIN 및 END 블록을 피하려고하는 이유는 중첩 된 awk를 피하는 것입니다.

일부 복잡한 코드 .... 부분에 다른 루프와 awk 코드를 배치 할 계획입니다.

for line in `cat file.txt`;do 
    var1=`echo $line | awk -F, '{print $1}'` 
    var2=`echo $line | awk -F, '{print $2}'` 
    var3=`echo $line | awk -F, '{print $3}'` 

    for line2 in `cat file_old.txt`;do 
     vara=`echo $line2 | awk -F, '{print $1}'` 
     varb=`echo $line2 | awk -F, '{print $2}'` 

     # Do comparison of $var1,var2 and $vara,$varb , then do something with either 
    done 
done 
+1

비교를 위해 'awk'을 사용하고 '무언가를하는'이유는 무엇입니까? – Bernhard

+0

awk와 비교하여 두 파일을 사용하는 것에 대한 샘플 코드를 제공 할 수 있습니까? file.txt와 file_old.txt의 두 파일은 다른 줄 크기를 가질 수 있습니다. – Nap

+1

죄송합니다. 나는 당신을 서로 비교하고 싶었습니다. 해결하려는 특정 문제와 파일 구조에 따라 다르지만, 나는 더 나은 솔루션이 있다는 강한 인상을 가지고 있습니다. – Bernhard

답변

4

당신은 while 루프 (대신 공백의) 쉼표를 사용하여 과제를 수행 할 IFS 내부 필드 구분 기호를 사용할 수 있습니다

SAVEIFS=$IFS; 
IFS=','; 
while read line; do 
    set -- $line; 
    var1=$1; 
    var2=$2; 
    var3=$3; 
    ... 
done < file.txt 

IFS=$SAVEIFS; 

IFS 현재의 복사본을 저장합니다, , 문자로 변경 한 다음 파일의 각 행을 반복합니다. 줄 set -- $line;은 쉼표로 구분 된 각 단어를 숫자 변수 ($1, $2 등)로 변환합니다. 이러한 변수를 직접 사용하거나 다른 (더 의미있는) 변수 이름에 할당 할 수 있습니다. 그들은 기능적으로 동일하고 명시 적으로 var1=$1을 설정 그냥 아래로 당신이 원하는 여부에 제공하거나이 while에 정의되어

IFS=','; 
while read var1 var2 var3; do 
    ... 
done < file.txt 

:

또는, 윌리엄에 의해 제공되는 답을 IFS을 사용할 수 있습니다 - 맙소사.

+0

루프가 두 개 중첩 될 때 문제가 있습니까? 변수 $ 1 $ 2 $ 3에 영향이 있습니까? – Nap

+0

네 스팅 된 루프 내에서'set - $ variable; '을 다시 호출하면'$ 1','$ 2', ..,'$ n' 변수는 parent-loop에서도 무시됩니다. 따라서이 방법을 사용하려면 먼저 다른 변수에 변수를 할당해야합니다. – newfurniturey

3

awk을 사용하고 있습니까?

while IFS=, read var1 var2 var3; do 
    ... 
done < file.txt 
+1

데이터가 쉼표로 구분 된 경우 입력 필드 구분자가 ','로 설정된 경우에도 동일한 접근 방식이 적용됩니다. while 루프 앞에 'IFS =', ''를 추가하십시오. – TaninDirect

+0

죄송합니다. 통지하지 않았습니다. –

0
#!/bin/bash  
FILE="/tmp/values.txt" 

    function parse_csv() { 
    local lines=$lines; 
    > $FILE 
    OLDIFS=$IFS; 
    IFS="," 
    i=0 
    for val in ${lines} 
    do 
     i=$((++i)) 
     eval var${i}="${val}" 
    done 
    IFS=$OLDIFS; 
    for ((j=1;j<=i;++j)) 
    do 
     name="var${j}" 
     echo ${!name} >> $FILE 
    done 

    } 

    for lines in `cat file_old.txt`;do 
    parse_csv; 
    done 

설명하는 문제는 3 개의 값만 있습니다. 3 개의 값이 4, 5 또는 정의되지 않았을 가능성이 있습니까?

위에서

/tmp/values.txt라는 파일에 새 줄에 한 번에 라인 출력하여 CSV 라인을 통해 각 값을 구문 분석합니다 귀하의 요구 사항에 맞게 자유롭게 수정할 경우 그 3 개의 값을 정의하는 것보다 훨씬 동적입니다.

관련 문제