簡體   English   中英

使用awk / sed / bash檢索所有必填字段后進行打印

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM