2012-08-16 93 views
2

我完全是AWK的新手,但我認爲這是解決我的問題和學習AWK的好時機的最佳方式。 我正在嘗試讀取由仿真程序創建的大型數據文件。輸出被人類讀取,所以它的格式不是很一致。輸出的一個例子是這樣的圖像 http://i.imgur.com/0kf8l.png閱讀半格式數據

在我需要一種方法來找到這樣一行「他2 4686A -2.088 0.0071」,通過指定「他2 4686A」的一部分,並得到以下兩個數字。問題是「He 2 4686A -2.088 0.0071」這條線可以出現在桌子的任何地方。 我知道如何找到條目「He 2 4686A」,但我不知道它的4列中的哪一列。所以我不知道如何解決它後面的值。 一個讓我只讀下面兩個單詞的命令,或者一旦找到匹配就告訴我模式的位置,這兩個命令都有幫助。

/赫2 4686A /找到線

鈣甲3970A -0.900 0.1100赫2 4686A -2.088 0.0071 S3中18.67米-0.371 0.3721 Ar 4的444.7A -2.124 0.0066

任何幫助理解。

+2

開始通過執行一個[AWK教程](http://www.hcs.harvard.edu/~dholland/computers/awk.html ),並首先嚐試一些事情。 SO非常適合獲得有關您所遇到的特定編程(相關)問題的幫助。 「任何幫助」都相當廣泛。簽出SO的[常見問題](http://stackoverflow.com/faq#questions)看看要問什麼,以及不要問什麼。祝你好運。 – 2012-08-16 19:28:10

回答

2

第一步應該是把什麼似乎是記錄4列插入1列格式...那麼它很容易與awk,因爲你可以再篩選的前5場 - 這樣的:

echo "He 2 4686A -2.088 0.0071" | \ 
awk '$1 == "He" && $2 == 2 && $3 == "4686A" {print $4, $5}' 

這給

-2.088 0.0071 

所以,對我來說,唯一的挑戰是將數據轉換爲一列格式...,然後從看似簡單的圖片,因爲它似乎是列有一個固定的長度你可以數。

假設您的列寬爲30個字符(難以從圖片中分辨出來,小心選項卡)並且您的數據在input_file中,那麼您可以先將數據「剪切」成4列,然後將輸出傳輸到另一個awk -Process

awk '{ 
    print substr($0,1,30) 
    print substr($0,31,30) 
    print substr($0,61,30) 
    print substr($0,91,30) 
}' input_file | \ 
awk '$1 == "He" && $2 == 2 && $3 == "4686A" {print $4, $5}' 

如果你真的只需要在未來兩個數字的背後錨然後我會說,從科斯塔grep - 溶液是最適合你,但是這給你實現進一步的邏輯可能性..

+0

確實如此,列的長度是固定的。做你所說的話肯定會奏效。我會嘗試一下,讓你知道發生了什麼。謝謝! – 2012-08-16 20:09:57

+0

您可以通過一次調用awk來完成您的雙awk解決方案。 – 2012-08-17 00:52:37

+0

@DennisWilliamson當然,我只是想說明如何將這些問題分解成更簡單的「原子」任務來解決這些問題...... – 2012-08-17 07:12:08

2

如果你還沒有使用awkgrep將是最簡單的方法...

egrep -o "He 2 4686A \-?[0-9.]+ \-?[0-9.]+" output.txt

編輯:如果間距與一個空白,這似乎並沒有成爲你的情況做了上述只會工作。爲了處理選項卡和/或重複的空格...

egrep -o "He[ \t]+2[ \t]+4686A[ \t]+\-?[0-9.]+[ \t]+\-?[0-9.]+" output.txt

+0

這似乎沒有爲我返回任何東西。 – 2012-08-16 20:20:52

+0

可能導致間距有標籤,很難僅從圖像中分辨出來。我剛剛從你粘貼的問題文本行開始工作。我會更新它來處理標籤... – Costa 2012-08-16 20:29:01

+0

你是對的,他們通過重複空格分隔。男人,這真是一個美麗的解決方案。非常感謝你。 – 2012-08-16 20:59:43