我已將資料庫表格資料轉儲到一個平面檔案中,以下是資料的樣子:(請從下面複製
;metier_code ;
;-------------------------;
(0 rows affected)
;CRDS_Ptf_No; ; ; ; ; ; ; ; ; ; ; ; ; ; ;Status;
;-----------;----------;--------------------------------;-------------------------;----------;--------------------------------;-;-------------------------;-------------------------;---------------;---------------;---------------;-------------------------;-------------------------;-----;------;
; NULL;ABCD ;ABHJARS ; ;ABCD ;ABCD ;Y; ; ; ; ; ; ; ; ;A ;
; 1234;XEU-ANKD ;XEU-AJKD ; ;ABCD ;ABCD ;Y; ; ; ; ; ; ; ; ;A ;
.
.
; 11745;ANJLDMAOKD;AMKDJ AN DJ JAHF AS CPFVH ACCR ;NONE ;AN DJ JAHA;AN DJ JAHA ;Y;NO ANKIO GAP ;YES AMK SCF ; ; ; ; ; ; ;I ;
; 11744;AMKDIONSKH;AMKDJ AN DJ JAHF AS CPFVH MTM ;NONE ;AN DJ JAHA;AN DJ JAHA ;Y;NO ANKIO GAP ;YES AMK SCF ; ; ; ; ; ; ;I ;
(5436 rows affected)
(return status = 0)
Return parameters:
; ;
;-----------;
; 5436;
(1 row affected)
; ; ;
;-------;-----------;
;grepkey; 5436;
(1 row affected)
想要將上面的內容轉換為以下格式:
行應包含序號(前綴)需要刪除原始檔案中開頭和結尾處存在的列名稱和空格。
以下是我使用建議的程式碼所取得的資料格式:
awk -F ';' '/^;-----------;/ {start=1;next;}; start==0 {next;}; {gsub(" +",""); print NR "" $0;}' temp_file > test
執行上述腳本後的格式:
7;NULL;ABCD;ABHJARS;;ABCD;ABCD;Y;;;;;;;;;A;
8;NULL;XEU-ANKD;XEU-AJKD;;ABCD;ABCD;Y;;;;;;;;;A;
.
.
5443;11744;AMKDIONSKH;AMKDJ AN DJ JAHF AS CPFVH MTM;;QWERDF;QWERDF;Y;;;;;;;;;A;
5444
5445(5436rowsaffected)
5446(returnstatus=0)
5447
5448Returnparameters:
5449
5450;;
5452;5436;
5453
5454
5455(1rowaffected)
5456;;;
5457;-------;-----------;
5458;grepkey;5436;
5459
5460(1rowaffected)
上圖:前綴行號不是依序出現的(透過使用不是實際資料的前面的行來遞增)。初始文件在平面文件中包含附加信息,例如列名@開始,在文件末尾有一些我想要的附加詳細信息,例如記錄數等
我想要以下格式的資料(應具有前綴行號,並且僅包含表格的行,而不包含額外的前面和超出的資料)
1;NULL;ABCD;ABHJARS;;ABCD;ABCD;Y;;;;;;;;;A;
2;NULL;XEU-ANKD;XEU-AJKD;;ABCD;ABCD;Y;;;;;;;;;A;
3;NULL;SWAPOLEIL;SWAPOLEIL;;QWERDF;QWERDF;Y;;;;;;;;;A;
.
.
5436;11744;AMKDIONSKH;AMKDJ AN DJ JAHF AS CPFVH MTM;;QWERDF;QWERDF;Y;;;;;;;;;A;
5436 - is the number of rows present in the table from where i am fetching the data.
答案1
awk -F ' *; *' \
'{printf "%d;",NR; for(i=2;i<=NF;i++) printf "%s;",$i; print "";}' file
-F
設定正規表示式的欄位分隔符號*; *
(即「兩側帶有任意數量(不包括零)空格的分號」)。
或者,更簡單:
awk -F ' *; *' -v OFS=";" '{$1=NR; $(NF+1)=""; NF--; print}' file
$(NF+1)=""; NF--;
只是強制重新計算,$0
但現在更改OFS
為字段分隔符。
更簡單:
awk -F ';' '{gsub(" +",""); print NR "" $0;}' file
如果awk
也應「處理」(即忽略)引導線:
awk -F ';' '/^;-----------;/ {start=1;next;};
start==0 {next;}; /^[^;]|^$/ { exit;}; { line_nr++; gsub(" +",""); print line_nr "" $0;}' file
編輯
我沒有引起足夠的重視,忘記調整上一個範例中的行號。由於讀取行與寫入行不再相同(普通),因此無法再使用 NR。
編輯2
/^[^;]|^$/ { exit;};
如果出現不以 開頭的行,則新增 會停止處理;
。
答案2
使用sed
和awk
sed -e '/^; *NULL/ s/ *//g' file | sed -n '/^;NULL.*/,$p' | awk '{print NR$0}'
sed -e '/^; *NULL/ s/ *//g' file
- 刪除以 開頭的行中的空格; NLL
。sed -n '/^;NULL.*/,$p'
- 刪除以 開頭的行之前的所有行; NULL
。awk '{print NR$0}'
- 列印其 NR 值前面的所有行。
答案3
我認為這裡甚至sed
可能awk
有點矯枉過正。
grep '^;.*NULL' <<\DATA | tr -d '[:blank:]' | grep -n .
;metier_code ;
;-------------------------;
(0 rows affected)
;CRDS_Ptf_No; ; ; ; ;
; ; ; ; ; ;
; ; ; ;Status;
;-----------;----------;--------------------------------;-------------------------;----------;--------------------------------;-;-------------------------;-------------------------;---------------;---------------;---------------;-------------------------;-------------------------;-----;------;
; NULL;ABCD ;ABCD ; ;ABCS ;ABCS
;Y; ; ; ; ;
; ; ; ;A ;
; NULL;PKG-ABCP ;UEX-SWAP ; ;ABCS ;ABCS
;Y; ; ; ; ;
; ; ; ;A ;
; NULL;SWAPOLEIL ;SWAPOLEIL ; ;QWERDF ;QWERDF
;Y; ; ; ; ;
; ; ; ;A ;
DATA
輸出
1:;NULL;ABCD;ABCD;;ABCS;ABCS;Y;;;;;;;;;A;
2:;NULL;PKG-ABCP;UEX-SWAP;;ABCS;ABCS;Y;;;;;;;;;A;
3:;NULL;SWAPOLEIL;SWAPOLEIL;;QWERDF;QWERDF;Y;;;;;;;;;A;