我需要在以下文本檔案的第一行/行 (UTC) 中匹配并回傳數字范圍 12-00 以下的值:
UTC 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 00 01 02 03 04 05 06
TMP 54 53 52 50 49 48 47 47 47 48 48 48 48 48 47 45 44 43 43 41 40 39 38 37 36
也就是說,12 13 14 15 16 17 18 19 20 21 22 23 00在第 1 行匹配并47 47 47 48 48 48 48 48 47 45 44 43 43從第 2行回傳。
我的嘗試:
cat some.text.file | head -n 3 | grep -A 1 '12.*.00' | tail -n 1
結果:
TMP 54 53 52 50 49 48 47 47 47 48 48 48 48 48 47 45 44 43 43 41 40 39 38 37 36
預期結果:
12 13 14 15 16 17 18 19 20 21 22 23 00
47 47 47 48 48 48 48 48 47 45 44 43 43
uj5u.com熱心網友回復:
我將按AWK如下方式使用 GNU執行此任務,讓file.txt內容為
UTC 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 00 01 02 03 04 05 06
TMP 54 53 52 50 49 48 47 47 47 48 48 48 48 48 47 45 44 43 43 41 40 39 38 37 36
然后
awk '/^UTC/{match($0,"12 13 14 15 16 17 18 19 20 21 22 23 00")}{print substr($0,RSTART,RLENGTH)}' file.txt
輸出
12 13 14 15 16 17 18 19 20 21 22 23 00
47 47 47 48 48 48 48 48 47 45 44 43 43
說明:我使用 2 個函式來處理字串,即match設定RSTART和RLENGTH,然后substr獲取行的那部分或它下面的部分。第一個操作僅限于以 開頭的行UTC,第二個操作適用于所有行。
免責宣告:此解決方案假設必須事先知道必須匹配的字串
(在 gawk 4.2.1 中測驗)
uj5u.com熱心網友回復:
這可以在一個單一的awk:
awk 'NR == 1 {for (i=1; i<=NF; i) if ($i == "12") start = i; else if ($i == "00") stop = i} {for (i=start; i<=stop; i) printf "%s", $i (i < stop ? OFS : ORS)}' file
12 13 14 15 16 17 18 19 20 21 22 23 00
47 47 47 48 48 48 48 48 47 45 44 43 43
一個更易讀的版本:
awk 'NR == 1 {
for (i=1; i<=NF; i)
if ($i == "12")
start = i
else if ($i == "00")
stop = i
}
{
for (i=start; i<=stop; i)
printf "%s", $i (i < stop ? OFS : ORS)
}' file
uj5u.com熱心網友回復:
一般來說,對于像這樣的問題,你想根據輸入欄位的一些映射輸出一組欄位,我發現最好創建一個陣列,將輸出欄位編號映射到輸入欄位編號(out2in[]如下),然后遍歷該陣列大批:
$ cat tst.awk
NR == 1 {
for (inFldNr=2; $inFldNr!=0; inFldNr ) {
if ( $inFldNr >= 12 ) {
out2in[ numOutFlds] = inFldNr
}
}
out2in[ numOutFlds] = inFldNr
}
{
for (outFldNr=1; outFldNr<=numOutFlds; outFldNr ) {
inFldNr = out2in[outFldNr]
printf "%s%s", $inFldNr, (outFldNr<numOutFlds ? OFS : ORS)
}
}
$ awk -f tst.awk file
12 13 14 15 16 17 18 19 20 21 22 23 00
47 47 47 48 48 48 48 48 47 45 44 43 43
上面假設00在輸入的第一行中總會有一個終止欄位編號,如果不是這種情況,只需調整邏輯來處理它。
uj5u.com熱心網友回復:
這可能對你有用(GNU sed):
sed -E 's/\s*$//;N;:a;/^12/!s/^.(.*\n)./\1/;ta;/00\n/!s/.(\n.*)./\1/;ta' file
打開擴展正則運算式-E。
修剪第一行空格的末尾。
追加下一行。
如果第一行的開頭不是12,則從兩行的開頭洗掉一個字符。
如果第一行的末尾不是00,則從兩行的末尾洗掉一個字符。
列印結果。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/362920.html
下一篇:Unix:模式匹配
