[英]printing after retrieving all the required fields using awk/sed/bash
尋找使用awk / sed / bash以所需格式打印的正確方法。
考慮具有以下內容的文件( awk_test.txt
),
Checkpoint number: ckpt.123
value1: 10
value2: 10
Checkpoint number: ckpt.234
value1: 20
value2: 25
如何從文件中提取數據並以以下格式在新行中打印?
ckpt.123,10,10
ckpt.234,20,25
我嘗試使用以下awk命令,但不能全部打印。
awk < awk_test.txt '/ckpt/{a=$NF} /value1/{b=$NF} /value2/{c=$NF} END {printf "%s,%s,%s\n",a,b,c}'
對於GNU awk,可以將Record Separator RS設置為任何正則表達式,在這種情況下,可以將其設置為Checkpoint number
。 字段分隔符FS可以設置為:
或\\n
。 這樣,線就變成了場。
gawk 'BEGIN{ RS="Checkpoint number" ; FS=": |\n"; OFS="," } { if(NR > 1){ print $2,$4,$6 }}' text.txt
結果:
ckpt.123,10,10
ckpt.234,20,25
注意:POSIX僅支持單個字符作為RS。 感謝@EdMorton和@Rafael的評論。 我不習慣考慮可移植性。
$ awk '/^Check/{if (NR>1) print rec; rec=$NF; next} {rec = rec "," $NF} END{print rec}' file
ckpt.123,10,10
ckpt.234,20,25
您只能在END
塊中打印數據。 當然,您需要結束塊,但是當您到達ckpt
行並且已經積累了一些數據時,您還需要打印。 這導致:
awk '/ckpt/ { if (a != "") printf "%s,%s,%s\n", a, b, c; a = $NF }
/value1/ { b = $NF }
/value2/ { c = $NF }
END { printf "%s,%s,%s\n", a, b, c }'
當將其用於樣本數據時,將產生:
ckpt.123,10,10
ckpt.234,20,25
或者甚至可以使用一個函數來封裝打印:
awk 'function print_it() { printf "%s,%s,%s\n", a, b, c; }
/ckpt/ { if (a != "") print_it(); a = $NF}
/value1/ { b = $NF }
/value2/ { c = $NF }
END { print_it() }'
這具有確保在需要打印的兩個地方使用相同的打印代碼的優點。
這可能對您有用(GNU sed):
sed -r 's/.*: //;N;N;s/\n[^:]*: /,/g' file
刪除標簽,並用逗號將換行符替換為模數為3的行。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.