簡體   English   中英

如何使用awk在列周圍添加單引號

[英]How to add single quotes around columns using awk

只是想知道如何在字段周圍添加單引號,以便我可以將它導入到 mysql 中而不會出現警告或錯誤。

我有一個包含大量內容的 csv 文件。

16:47:11,3,r-4-VM,250000000.,0.50822578824,131072,0,0,0,0,0

期望輸出

'16:47:07','3','r-4-VM','230000000.','0.466028518635','131072','0','0','0','60','0'

我真的不知道從哪里開始,非常感謝您的幫助。

你可以試試這個

awk -F"," -v quote="'" -v OFS="','" '$1=$1 {print quote $0 quote}' file
  1. 將每個分隔符 (, 逗號) 替換為 (',' quote-comma-quote) -> (-F"," -v OFS="','")
  2. 在行首和行尾添加引號 -> (print quote $0 quote)
#!/usr/bin/awk -f

BEGIN { FS=OFS=","}

{
    for (i = 1; i <= NF; ++i)
        $i = "'" $i "'"
    print
}

開始時,將FS (字段分隔符)設置為逗號; 還將輸出字段分隔符OFS設置為逗號。

對於每個輸入行,循環遍歷所有字段。 NF是從當前行解析出的字段數。 將每個字段設置為由單引號括起來的自己的值。

完成更新字段后,打印修改后的行。

試試這個:

awk '{gsub(/^|$/,"\x027");gsub(/,/,"\x027,\x027")}7' file

例子

kent$  echo "16:47:11,3,r-4-VM,250000000.,0.50822578824,131072,0,0,0,0,0"|awk '{gsub(/^|$/,"\x027");gsub(/,/,"\x027,\x027")}7'
'16:47:11','3','r-4-VM','250000000.','0.50822578824','131072','0','0','0','0','0'

這可能對你有用(GNU sed):

sed -r 's/[^,]+/'\''&'\''/g' file

要么:

sed -r "s/[^,]+/'&'/g" file

awksed不會(輕松)確定字段分隔符 ( , ) 是否被轉義。 CSV文件格式逃脫,通過在雙引號(見第2.6節整場周邊領域內的字符RFC4180 )。

正如我在這個答案中所描述的,一種更強大的方法是使用 csv 庫,而不是使用正則表達式等解析為文本。

我發現 Python 的庫是最好的選擇,因為它是:

  1. 廣泛可用,沒有繁重的依賴,除了 Python 本身;
  2. 對您使用的 Python 版本不是特別敏感;
  3. 適合嵌入在 shell 腳本中;
  4. 非常緊湊(單線就行!)。

根據問題的標簽,我懷疑這些標准也會吸引您。

因此,請嘗試以下操作:

QUOTE_CSV_PY="import sys; import csv; csv.writer(sys.stdout, quoting=csv.QUOTE_ALL, quotechar=\"'\").writerows(csv.reader(sys.stdin))"
python -c "$QUOTE_CSV_PY" < file

分解:

  • QUOTE_CSV_PY是包含 Python 單行命令的 shell 變量
  • Python 命令很簡單:
    • 導入標准的 sys 和 csv 模塊;
    • 創建CSV筆者,寫入標准輸出( stdout )與QUOTE_ALL集等等各個領域得到引述使用quotechar ,它被設置為一個單引號;
    • 為 csv 編寫器提供一個從標准輸入( stdin )讀取的 csv 閱讀器。
  • 第二行只是將 one-liner 傳遞給 python 解釋器,並將 csv 文件(稱為filestdin到它的stdin
awk 'BEGIN{FS=OFS=","}{for (i=1;i<=NF;++i)  $i="~"$i"~"}{print}' $input_csv_file

這有效。 在這里,我用~將所有 csv 文件列括起來。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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