我是 bash 腳本的新手,我正在學習用于資料清理的腳本。我有一個大檔案,我設法洗掉了必要的列并將其保存到一個新檔案中。需要幫助來實作我正在尋找的結果。
2 Media Server Community - WebRTC, MP4, HLS, RTMP"
29 Media Server Enterprise
7 Media Server lite
10 Media server lite 1.0
468 Media server lite 2.0
8 Media server lite 2.3
1 Media server lite 2.4
40 Media server lite 3.0
3 Media server lite 3.3
我怎么能編輯這個檔案現在使 csv 檔案作為
2 | Media Server Community - WebRTC, MP4, HLS, RTMP"
29 | Media Server Enterprise
7 | Media Server lite
10 | Media server lite 1.0
468 | Media server lite 2.0
8 | Media server lite 2.3
1 | Media server lite 2.4
40 | Media server lite 3.0
3 | Media server lite 3.3
uj5u.com熱心網友回復:
我寧愿看到您發布(部分)原始資料檔案并向您展示它是如何使用 awk 完成的,但這是您使用 GNU awk ( gensub) 要求的內容:
$ gawk '{print gensub(/([0-9] )/,"\\1| ",1,$0)}' file
輸出:
2 | Media Server Community - WebRTC, MP4, HLS, RTMP"
29 | Media Server Enterprise
7 | Media Server lite
...
編輯:嗯,gensub我猜最近太多了,只需使用 awk:
$ awk '{sub(/([0-9] )/,"&| ")}1' file
uj5u.com熱心網友回復:
any 的另一種方法awk是使用match()定位第一個數字和空格結束的位置,然后使用substr()列印到該點,添加 a"|"然后substr()再次使用從該點列印到最后,例如
awk '{
match($0,/^[ \t0-9] /)
print substr($0,0,RLENGTH-1), "|", substr($0, RLENGTH 1)
}'
示例使用/輸出
使用檔案名中的示例輸入media,您將執行以下操作:
$ awk '{ match($0,/^[ \t0-9] /); print substr($0,0,RLENGTH-1), "|", substr($0, RLENGTH 1) }' media
2 | Media Server Community - WebRTC, MP4, HLS, RTMP"
29 | Media Server Enterprise
7 | Media Server lite
10 | Media server lite 1.0
468 | Media server lite 2.0
8 | Media server lite 2.3
1 | Media server lite 2.4
40 | Media server lite 3.0
uj5u.com熱心網友回復:
全部 猛擊 / zsh 回答。
如果您沒有與第一個欄位周圍的空白結婚,您可以這樣做:
$ while read -r x rest; do printf "%s|%s\n" "$x" "$rest"; done <file
2|Media Server Community - WebRTC, MP4, HLS, RTMP"
29|Media Server Enterprise
7|Media Server lite
10|Media server lite 1.0
468|Media server lite 2.0
8|Media server lite 2.3
1|Media server lite 2.4
40|Media server lite 3.0
3|Media server lite 3.3
結果是一個單字符"|"分隔符 CSV 檔案,而不是" | "一個 CSV 分隔符的三個字符(以后更難處理......)
如果您希望第一個欄位更寬并且是一列,您可以使用 Bash 正則運算式將第一個欄位與其余欄位分開:
while IFS= read -r line || [[ -n $line ]]; do
if [[ $line =~ ^[[:blank:]]*([[:digit:]] )[[:blank:]] (.*) ]]; then
printf "%4s | %s\n" "${BASH_REMATCH[1]}" "${BASH_REMATCH[2]}"
fi
done <file
2 | Media Server Community - WebRTC, MP4, HLS, RTMP"
29 | Media Server Enterprise
7 | Media Server lite
10 | Media server lite 1.0
468 | Media server lite 2.0
8 | Media server lite 2.3
1 | Media server lite 2.4
40 | Media server lite 3.0
3 | Media server lite 3.3
為 awk 回答,我會這樣做:
awk -v de=" | " '
FNR==NR{length($1)>max ? max=length($1) : max=max; next}
{
s=""
for (i=2;i<=NF;i ) s=s ? s OFS $i : $i
printf " %*s%s%s\n", max, $1, de, s
}
' file file
2 | Media Server Community - WebRTC, MP4, HLS, RTMP"
29 | Media Server Enterprise
7 | Media Server lite
10 | Media server lite 1.0
468 | Media server lite 2.0
8 | Media server lite 2.3
1 | Media server lite 2.4
40 | Media server lite 3.0
3 | Media server lite 3.3
uj5u.com熱心網友回復:
與sed(1)
sed 's/^\([[:space:]]*[[:digit:]]\{1,\}\)/\1 |/' file.txt
的
^是錨定,這意味著啟動/開始。這
( )是一個捕獲組,((和)需要用 BRE 轉義)里面的任何模式都將在\1. 這是第一個捕獲組。[[:space:]]空白。*是一個量詞,表示零個或多個。[[:digit:]]是一個整數。{1,}是一個表示一個或多個的量詞,但{和}需要使用 BRE 進行轉義,BRE 是sed.
如果使用-E標志/選項 (ERE),則可以在模式匹配中省略轉義。
sed -E 's/^([[:space:]]*[[:digit:]]{1,})/\1 |/' file.txt
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/335106.html
