[英]File fields and columns adjustment with awk [LINUX]
我在將 linux 文件中的列分隔符調整到數據庫時遇到問題。
我需要 14 列,我使用“|” 作為分隔符,所以我申請了:
awk -F'|' '{missing=14-NF;if(missing==0){print $0}else{printf "%s",$0;for(i=1;i<=missing-1;i++){printf "|"};print "|"}}' myFile
假設我有這樣的一行:
a|b|c|d|e||f||g||||h|i|
應用 awk 命令后,它將是:
a|b|c|d|e||f||g||||h|i||
這是不可接受的,我只需要數據為 14 列。
示例輸入{在 14 個字段行的情況下]:
a|b|c|d|e||f||g||||h|i
沒做什么
示例輸入{如果有額外字段]:
a|b|c|d|e||f||g||||h|i|
輸出:
a|b|c|d|e||f||g||||h|i
示例輸入{如果字段較少}:
a|b|c|d||e||f||g|h
output:
a|b|c|d||e||f||g|h|||
您可以使用這個gnu-awk
解決方案:
awk -v n=14 '
BEGIN {FS=OFS="|"}
{
$0 = gensub(/^(([^|]*\|){13}[^|]*).+/, "\\1", "1")
for (i=NF; i<=n; ++i)
$i = ""
} 1' file
a|b|c|d|e||f||g||||h|
a|b|c|d|e||f||g||||h|
a|b|c|d||e||f||g||||
原始文件在哪里:
cat file
a|b|c|d|e||f||g||||h|i
a|b|c|d|e||f||g||||h|i|
a|b|c|d||e||f||g|h
這里:
gnsub
我們刪除所有額外的字段for
循環我們創建新字段以使NF = n
如果您沒有gnu-awk
,那么以下內容應該適用於非 gnu awk(在 BSD awk 上測試):
awk -v n=14 '
BEGIN {FS=OFS="|"}
{
for (i=NF; i<=n; ++i) $i=""
for (i=n; i<=NF; ++i) $i=""
NF = n
} 1' file
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.