簡體   English   中英

使用 awk [LINUX] 調整文件字段和列

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

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