
例如我的文件是這樣的:
59 6 18 2014 169 7 14 2 7671912 7849744 201 4
60 6 19 2014 170 5 49 2 7671912 7849744 201 5
61 6 20 2014 171 6 8 2 7671912 7849744 201 6
62 6 23 2014 174 5 3 2 7671912 7849744 201 7
63 6 23 2014 174 7 17 2 7671912 7849744 201 8
64 6 24 2014 175 16 13 2 7671912 7849744 201 9
65 6 25 2014 176 8 20 2 7671912 7849744 201 10
10
1 1 49 6 16 2014 7 39 201 1 0 1043 <au_launchpad_back.gif> 201 gif <SIZE> 871
1 2 49 6 17 2014 13 15 201 1 0 1043 <au_launchpad_back.gif> 201 gif <SIZE> 871
1 3 49 6 18 2014 1 38 201 1 0 1043 <au_launchpad_back.gif> 201 gif <SIZE> 871
1 4 49 6 18 2014 7 14 201 1 0 1043 <au_launchpad_back.gif> 201 gif <SIZE> 871
1 5 49 6 19 2014 5 49 201 1 0 1043 <au_launchpad_back.gif> 201 gif <SIZE> 871
我需要列印單一令牌條目“10”的前一行,它應該是
65 6 25 2014 176 8 20 2 7671912 7849744 201 10
我怎樣才能做到這一點?
答案1
您可以使用awk
:
awk 'NF == 1 { print LAST } { LAST=$0 }' < datafile
這會保存檔案 ( LAST=$0
) 的每一行,並且當一行只有一筆記錄時(粗略地說NF == 1
-NF
是該行上的標記數),它會列印已儲存的前一行。
答案2
如果該標記只出現一次,您可以使用 GNU 來執行此操作grep
:head
grep -x -B 1 10 file | head -n 1
指示列印匹配行及其之前的行-B 1
。grep
使用該-x
選項,匹配實際上grep 10
的行(而不是x
10
含有 10
)。最後,head -n 1
僅列印結果行的第一行。
答案3
sed
您可以使用sed
:
sed -e '/^10$/{x;p;}' -e 'x;d' < datafile
解釋:
此位址與包含 10的行/^10$/
相符。{x;p;}
x
p
由於腳本的其餘部分,保留空間包含前一行。對於檔案的每一行,將x
保留空間與模式空間交換 ( ),然後刪除 ( d
) 模式空間中的所有內容。
與第一個命令不同,第一個命令有一個位址前綴,導致它僅在看到第 10 行時才匹配,而這些命令沒有前綴,因此會匹配檔案的每一行。最終結果是,我們繼續將看到的最後一行放入保留空間,而我們刪除模式空間的事實意味著,當我們看到 10 時,除了顯式輸出之外沒有其他輸出。