簡體   English   中英

awk處理單行,其字段由分號分隔,RS失敗

[英]awk processing single line with fields separated by semicolons failing with RS

我有一個名為strg.cfg的文件,其中包含內容

iMac;1;1;37;;Monitor;1;1;0;;Thunderbolt;1;0;0;;TimeMachine;0;0;0;;USB;1;0;0;;Lacie Stereo;0;0;0;;Rland MacMini;0;0;0;;Scanner;0;0;0;;end

記錄由兩個分號分隔; 和字段由一個分號組成。 我嘗試使用以下awk文件處理此文件

BEGIN {FS=";"; RS="/\;\;/"}
{ print $1 ", " $2 ", " $3 ", " $6 }

$ 6被用作測試,因為如果它可以工作,那么它就不會打印任何內容,因為它只有四個字段。 但這似乎不起作用,好像根本沒有考慮RS =一樣。 它將始終始終將整個行視為記錄。 以6美元的價格打印“顯示器”,而不打印其他行。

您沒有顯示預期的輸出,因此我們只能猜測,這是您想要的嗎?

$ cat tst.awk
BEGIN {FS=";"; OFS=", "; RS=";;"}
RT{ print $1, $2, $3, $6 }

$ awk -f tst.awk file
iMac, 1, 1,
Monitor, 1, 1,
Thunderbolt, 1, 0,
TimeMachine, 0, 0,
USB, 1, 0,
Lacie Stereo, 0, 0,
Rland MacMini, 0, 0,
Scanner, 0, 0,

上面使用GNU awk進行多字符RS和RT。 如果您沒有GNU awk,那么最簡單的解決方案是轉換;; s到通常的RS(\\ n)首先:

awk '{gsub(/;;/,"\n")}1' file | awk '....'

但是,如果您不想使用2個awk調用和管道,則可以執行以下操作:

$ cat tst.awk
BEGIN {FS=";"; OFS=", "; RS=";"}
/^$/ {
    $0 = rec
    rec = ""
    print $1, $2, $3, $6
    next
}
{ rec = (rec ? rec FS : "") $0 }

$ awk -f tst.awk file
iMac, 1, 1,
Monitor, 1, 1,
Thunderbolt, 1, 0,
TimeMachine, 0, 0,
USB, 1, 0,
Lacie Stereo, 0, 0,
Rland MacMini, 0, 0,
Scanner, 0, 0,

Awk組合了不同的命令。 當您只想替換;; 在選擇字段之前用新的一行

sed 's/;;/;\n/g' strg.cfg | cut -d";" -f1,2,3,6

或替換結果中的某些內容

sed 's/;;/;\n/g' strg.cfg | cut -d";" -f1,2,3,6 | sed 's/;/, /g'

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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