Text-Processing

來自帶有修改的文本的 AWK

  • May 19, 2019

我有以下文件:

hello there. let's try&ACCT=1&bla bla bla&EX=1118&anything ss &SERIAL=1011&DEAL=NO
BLA BLA BLA&TOM=1&ACCT=2&LSLSLSLSL&none=1&EX=1218&lord=1&ok=1&SERIAL=201&flag=non

我需要從中提取 的欄位值,ACCT=以便 輸出變為:EX=``SERIAL=

1,11/18,1011
2,12/18,201

whereEX總是一個 4 位數字,我想在其中插入 a/作為中間字元。

根據我放入名為 test.in 的文件中的範例輸入,以下 awk 命令應該為您提供所需的輸出。

awk -F\& '{for (i=1; i<+NF; i++) {if ($i ~ /^ACCT=/) {acct=$i; sub(/^ACCT=/, "", acct)} if ($i ~ /^EX=/) {ex=$i; sub(/^EX=/, "", ex); sub(/^[0-9][0-9]/, "&/", ex)} if ($i ~ /^SERIAL=/) {serial=$i; sub(/^SERIAL=/, "", serial)}} printf("%s,%s,%s\n", acct, ex, serial)}' test.in

這樣做是將 & 視為欄位分隔符。然後,它通過檢查該欄位是否以 ACCT=、EX= 或 SERIAL= 開頭來處理給定行中的每個欄位。如果找到該欄位,則將該欄位分配給適當的變數。然後使用 sub 命令刪除該變數的開頭。這只是為您提供與該鍵關聯的值。

由於您需要在 EX 鍵的前 2 位數字後加上斜杠 (/),因此這是 EX 的另一個子。與號 (&) 是一個反向引用,用於獲取前 2 位數字。

處理完所有欄位後,它會列印出在該行中找到的值。

引用自:https://unix.stackexchange.com/questions/480561