簡體   English   中英

僅從 TSV 文件的雙引號字符串中刪除制表符?

[英]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.

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