2012-10-05 43 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 

我認爲這是昂貴的,因爲它多次解析linux變量。是否有特殊的語法來一次設置變量?我知道awk有一個BEGIN和END塊,但是我試圖避免BEGIN和END塊的原因是爲了避免嵌套的awk。

我打算在#Some複雜代碼....部分放置另一個循環和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

可以使用IFS內部字段分隔符使用逗號(而不是空格),做任務的while循環:

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等)。您可以直接使用這些變量,也可以將它們分配給其他(更有意義的)變量名稱。

或者,你可以使用IFS與威廉給出了答案:

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

它們在功能上是相同的,它只是歸結到你是否要明確設置var1=$1還是有它的while定義 - 洛普的頭。

+0

嵌套兩個while循環時有什麼問題嗎?變量$ 1 $ 2 $ 3會起作用嗎? – Nap

+0

如果您在嵌套循環內再次調用'set - $ variable;',$ 1','$ 2',..,設置的'$ n'變量也將在父循環中被覆蓋。所以,如果你想使用這種方法,你可能需要確保先將它們分配給其他變量。 – 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或未定義?

若有以上將通過CSV一行一行地輸出每個值在一個時間在一個名爲/tmp/values.txt

文件解析一個新行隨意修改以符合您的要求,其遠比定義3個值更具動態