
這是 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
該正則表達式將被讀取為提取用雙引號值括起來的字串(假設沒有轉義雙引號),該字符串與其上的等號相鄰左邊。然後將這些值的集合stdout
與OFS
. - 在循環解決方案的情況下
while
,我們首先按原樣讀入該行,不進行分詞。然後我們將 IFS 設為 an=
並拒絕第一個欄位。現在所有欄位都將具有以下格式,"..."...
然後我們使用該expr
實用程式充實雙引號內的值並將它們放在$@
陣列中。在循環結束時,for
我們刪除原始元素($N
),然後剩下的就是我們想要的。最後透過將 IFS 設定為逗號並展開,將它們透過逗號連接在一起$*
。