2010-08-30 52 views
2

有沒有使用列(非字段)編號使用awk過濾行的方法?我想要獲取包含分配給變量的字段6的值的文本文件中的所有行。我正在使用:使用awk列(非字段)編號進行搜索

awk -v temp=${het} '{if $6 == temp} print $0}' 

但我已經注意到,非常偶爾的字段5是空白的,它會混淆。我真正需要的是

if colx-y == temp 

但這似乎並不存在。有沒有辦法做到這一點

輸入格式如下所述,我剛剛發現我必須處理的另一個變化。我想提取(在這種情況下)602.第五個字段可能存在也可能不存在,也可能會進入第6個(以下兩個示例)。的文件格式已經包含了6場列23-26 - GAWK聽起來像它可能是更好的選擇:你爲什麼不如果使用別的

HETATM 5307 S MOY A 602  14.660 14.666 109.556 1.00 26.41   S 
HETATM 5307 S MOY 602  14.660 14.666 109.556 1.00 26.41   S 
HETATM 5307 S MOY A1602  14.660 14.666 109.556 1.00 26.41   S  
+0

顯示您的輸入文件的例子! – ghostdog74 2010-08-30 10:41:43

回答

0

像下面算法中:

if $5 is not blank 
{ 
if $6==temp print $0 
} 
else if $7==temp print $0 

這也將是比較容易理解,如果你提供一些樣本輸入!

+0

對不起! 一個典型的輸入行是 HETATM 5307 S MOY A 602 14.660 14.666 109.556 1.00 26.41 S 有時A(或任何字符在此位置)被省略。格式是由列號定義的,所以這將不太容易出錯 – Chris 2010-08-30 10:47:48

0
awk -F"[ ]" -v temp=${het} '$6==temp' file 
+0

這已經超出了我的awk知識的範圍,我不認爲我看到了「[]」字段分隔符的全部含義 - 你能不能解釋一個? – Chris 2010-08-30 11:18:39

+0

請看schot的答案:) – ghostdog74 2010-08-30 12:25:10

2

請將示例輸入添加到您的問題,而不是評論。目前還不清楚你的輸入是怎樣的。鑑於你的「正常」的輸入線:

 
HETATM 5307 S MOY A 602 14.660 14.666 109.556 1.00 26.41 S 

以下哪兩場比賽中你輸入「字段5是空白」:

 
HETATM 5307 S MOY 602 14.660 14.666 109.556 1.00 26.41 S 
HETATM 5307 S MOY 602 14.660 14.666 109.556 1.00 26.41 S 

在第一種情況下,ghostdog74's answer應該工作。他使用的-F"[ ]"只是在單個空間上進行拆分的巧妙方式。 -F" "不起作用,因爲然後awk使用其默認的空白分割。

如果您的數據是第二格式的,我會用substr()提取正確的字段:

awk -v temp=${het} 'substr($0, 20, 3) == temp' 

另一種選擇,可以使用GAWK的fixed-width splitting,但它確實取決於對確切格式的輸入。

+0

謝謝大家的幫助。該gawk指針是一個很大的幫助,我會給fieldwidth手冊頁看看並使用它。從這裏應該可以 – Chris 2010-08-30 14:54:48

0

基於schot's建議和您的示例數據:

awk -v FIELDWIDTHS="6 1 4 2 1 3 3 1 1 1 3" '{print $11}' 

最後的 「3」 中FIELDWIDTHS表示包含 「602」 的場。我已經省略了該行其餘部分的字段寬度。有些字段寬度可以合併,但我不知道什麼是空格作爲分隔符與空格作爲字段內容。