需要將輸出格式化為csv格式

需要將輸出格式化為csv格式

這是 abc.txt 文件

NAME="MARK" StartTime="14:11:26.710583" TotalElapsedTime="0" Pool="10" ThreadsReached="0"
NAME="MARK" StartTime="14:11:26.710583" TotalElapsedTime="0" Pool="10" ThreadsReached="0"

需要 abc.csv 的以下格式的輸出

NAME    StartTime   TotalElapsedTime    Pool    ThreadsReached
MARK    14:11:26.710583     0       10      0
MARK    14:11:26.710583     0       10      0

答案1

由於基本 CSV 格式假定逗號,作為欄位分隔符,因此使用下列 GNUsed方法:

sed -e '1iNAME,StartTime,TotalElapsedTime,Pool,ThreadsReached' -e 's/[^=]*="\([^"]*\)"/\1,/g; s/,$//g' file

輸出:

NAME,StartTime,TotalElapsedTime,Pool,ThreadsReached
MARK,14:11:26.710583,0,10,0
MARK,14:11:26.710583,0,10,0

1i- 插入物標頭文件第一行之前的行

s/[^=]*="\([^"]*\)"/\1,/g- 提取所有屬性值

答案2

while IFS= read -r l; do
   set -f; IFS==; set -- $l; shift; N=$#
   for arg
   do
      set -- ${1+"$@"} "$(expr " $arg" : ' "\(.*\)"')"
   done
   shift "$N"; IFS=,; echo "$*"
done < abc.txt

while IFS= read -r l; do
   set -f; IFS==; set -- $l; shift
   while case ${#} in 1 ) break ;; esac; do
      expr " $1" : ' "\(.*\)"'
      shift
   done | tr \\n ,; expr " $*" : '.*"\(.*\)"'
done < abc.txt

perl -lne '$,=",";
   print /(?:^|\h)\K[^=]*/g if $. == 1;
   print /="([^"]*)"/g;
' abc.txt

說明

  • 在 Perl 程式碼中,從第一行開始,我們透過正規表示式提取欄位名稱,該表達式被讀取為獲取左側顯示水平空白或行開頭的字元/(?:^|\h)\K[^=]*/g運行。然後使用設定為逗號來列印這些內容。non=\h^OFS $,
  • 對於所有行(也包括第一行),我們透過正則表達式提取字段值,/="([^"]*)"/g該正則表達式將被讀取為提取用雙引號值括起來的字串(假設沒有轉義雙引號),該字符串與其上的等號相鄰左邊。然後將這些值的集合stdoutOFS.
  • 在循環解決方案的情況下while,我們首先按原樣讀入該行,不進行分詞。然後我們將 IFS 設為 an=並拒絕第一個欄位。現在所有欄位都將具有以下格式,"..."...然後我們使用該expr實用程式充實雙引號內的值並將它們放在$@陣列中。在循環結束時,for我們刪除原始元素($N),然後剩下的就是我們想要的。最後透過將 IFS 設定為逗號並展開,將它們透過逗號連接在一起$*

相關內容