[英]Remove tabs only from within double-quoted strings in TSV file?
我有一個 TSV 文件,經過進一步檢查,有時在某些行的某些雙引號字符串字段中包含選項卡(似乎在各種字符串字段中任意發生),並希望在 bash 中刪除這些選項卡。 例如。 在vi
中使用:set list
查看文件時,我看到類似...
1234^I"some^Itext field"^I"more text"^I4678^I"other^Itext here"$
並想得到類似...
1234^I"some text field"^I"more text"^I4678^I"other text here"$
任何人都知道如何在 bash 中有效地做到這一點?
如果您有 GNU awk,您可以使用其FPAT
變量將每一行拆分為字段,然后使用gsub
編輯它們:
gawk -v OFS='\t' -v FPAT='"(""|[^"]*)*"|[^\t]*' '
{
for (i=1; i<=NF; i++)
gsub(/\t/, " ", $i)
print
}
' in.tsv > out.tsv
OFS
設置為制表符,以便print
生成制表符分隔的 output。
我在這里給出的 FPAT 的值將字段定義為:
或者:
請注意,gawk 無法處理字段中嵌入的換行符。
參見: https://www.gnu.org/software/gawk/manual/html_node/Splitting-By-Content.html
這不是最強大的解決方案,但也許您可以將其用作起點。
sed -e 's/\("[^\t"]*\)\t\([^\t"]*\)"/\1 \2/g' tsv_file.txt
我認為一個合適的解決方案需要一個小的文本解析器,它可能最好用 Perl 或 Python 之類的語言編寫。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.