2012-04-16 84 views
0

我有一個帶有文件名列表的文本文件。我想使用AWK從特定的行號創建一個變量。使用AWK從文件中讀取行並創建變量

awk "NR==\$Line" /myPath/fileList.txt 

我想這個輸出分配給一個變量,並從文檔,我發現我的預期了以下工作:

INFILE=$(awk "NR==\$Line" /myPath/fileList.txt) 

INFILE=`awk "NR==\$Line" /myPath/fileList.txt` 

我用得到正確的輸出然而,

echo "\$INFILE" 

是空白的。我對bash腳本很陌生,並會很欣賞任何指針。

+0

這兩個命令都不提供任何輸出,它們設置變量INFILE。 (第一個版本是「更好」。) – Mat 2012-04-16 20:30:34

+0

對不起,我應該澄清。回聲「\ $ INFILE」是空白的。 – Sara 2012-04-16 20:50:10

+0

如果您逃避美元符號,則不會展開INFILE變量。改用'echo「$ INFILE」'來代替。 – ghoti 2012-04-17 01:27:28

回答

0

不要掩蓋美元符號。

錯誤:

echo "\$INFILE" 

權:

echo $INFILE 
echo ${INFILE} 
echo "$INFILE" 
echo "${INFILE}" 

的$ {X} - 結構是有用的,如果你喜歡膠水文本一起。

echo $INFILE0 

將查找變量INFILE0。如果$ INFILE是5,它不會產生「50」。

echo ${INFILE}0 

這將產生50,如果INFILE是5

如果變量包含空格撇號是有用的,或多或少不可預知的文本。

如果您ROWNUMBER是一個參數:

#!/bin/bash 
Line=$1 
INFILE=$(awk "NR==$Line" ./demo.txt) 
echo "$INFILE" 

如果INFILE包含多個空格或製表符,回聲$ INFILE將他們凝聚到單個空格,而「$ INFILE」保留他們。

+1

不,這不會產生INFILE十次。它會在後面產生一個「0」的INFILE。在這種情況下,花括號不用於參數擴展和支撐擴展 - 只有前者。你可以做'INFILE = foo; echo「$ {INFILE}」{0..9}'這會輸出'foo0 foo1 foo2 foo3 foo4 foo5 foo6 foo7 foo8 foo9'。順便說一句,你應該總是*引用輸出變量。這些不是撇號(單引號),它們是雙引號。 – 2012-04-16 21:26:10

+0

我可以通過硬編碼行號得到這個工作:infile = $(awk「NR == 1」/myPath/fileList.txt)。但我只能看到使用echo \ $ infile的值。 echo $ infile是空白的。我仍在努力理解這是爲什麼。 – Sara 2012-04-16 22:31:02

+0

@ DennisWilliamson:如果INFILE是7,它會產生70,這就是我的意思。但是,我的第一印象是,一行的內容是一個數字,是錯誤的,儘管我最終意識到這一點,但在寫作時我被打斷了,忘記調整第一個例子。我不同意「你應該永遠......」 - 這是貨物崇拜節目。 – 2012-04-17 01:05:21

3

將AWK命令的輸出分配給變量。要查看變量的內容,這樣做:

echo "$INFILE" 

你應該用你的AWK命令單引號,這樣你就不必逃避文字美元符號(文字字符串應該被引用,請參見下面如果要替換一個shell變量來代替):

awk 'NR == "$Line"' /myPath/fileList.txt 

$()之上,反引號形式,但最好(我不明白爲什麼你有反引號逃脫,順便說一句)。此外,您應該習慣性地使用小寫或混合大小寫變量名稱,以避免與shell或環境變量發生名稱衝突。

infile=$(awk 'NR == "$Line"' /myPath/fileList.txt) 
echo "$infile" 

如果你的目的是,一個名爲$Line變量的值應該被替換,而不是文本字符串「$線」被使用,那麼你應該使用AWK的-v變量傳遞功能:

infile=$(awk -v "line=$Line" 'NR == line' /myPath/fileList.txt) 
+0

$ line變量是由我的作業調度程序SGE設置的環境變量。我相信我需要在提交腳本中轉義變量名稱。我嘗試了infile = $(awk -v「line = $ SGE_TASK_ID」'NR == line'/myPath/fileList.txt),但是從echo $ infile得到了相同的結果。 – Sara 2012-04-16 22:00:43

+0

@Sara:那麼可能我最後一個例子就是要走的路。然後你可以'echo'$ infile「'或者用其他方式使用變量,當然。 – 2012-04-16 22:02:52

+0

謝謝,你的例子有道理,看起來應該可以工作,但在跟蹤它之後,我仍然從echo「$ infile」獲得相同的空白結果。 – Sara 2012-04-16 22:41:01