2013-04-26 53 views
0

我有它有兩種不同格式的許多條目列表:在Bash中,如何從文件中提取單詞和以下編號?

Generated Request {some text} easy level group X 
---or--- 
easy level group X {some text} 

,其中X爲1-6位數的數字。

我試圖逐行瀏覽該文件,並減少每行中的「組X」(以便我可以將其與另一個文件進行比較)。

我會在下面發佈我的嘗試,所以你可以和我一起嘲笑它,但是我只是拿起了bash,awk和sed的基礎知識,所以我現在很抱歉爲這個好的腳本攻擊...

for line in $(< abc.txt);do 
    if [ ${line:0:2} == "Ge" ] then 
    awk '{print $8,$9}' $line >> allgood.txt 
    elif [ ${line:0:2} == "ea" ] then 
    awk '{print $3,$4}' $line >> allgood.txt 
    fi 
done 

嘗試的邏輯是,如果它以「Ge」開頭,然後提取短語$ 8和$ 9並追加到文件。如果以「ea」開頭,則提取短語$ 3和$ 4並追加到同一個文件中。但是,這根本不起作用。

有什麼想法?

回答

3

這個問題的最簡單的方法是使用grep:僅

grep -o 'group [0-9]*' file 

-o選項顯示該線的匹配的部分。


你從來沒有在每一行使用bash循環中的一個文件,然後行傳遞給awk,因爲這是awk作品究竟如何​​,它遍歷每一行,並適用相關的塊。下面是使用你的邏輯在純awk的方法:

awk '/^Ge/{print $8,$9}/^ea/{print $3,$4}' file 
1

你可以用「而讀」做到這一點,避免AWK如果你喜歡:

while read a b c d e f g h i; do 
    if [ ${a:0:2} == "Ge" ]; then 
    echo $h $i >> allgood.txt; 
    elif [ ${a:0:2} == "ea" ]; then 
    echo $c $d >> allgood.txt; 
    fi; 
done < abc.txt 

字母代表每一列,所以你」你需要儘可能多的列你。之後,你只需輸出你需要的字母。

+0

這是對'cat'的無用使用,應該用'done 2013-04-26 23:00:28

+0

良好的通話。謝謝。 – 2013-04-26 23:05:50

相關問題