Удалить вкладки только из строк в двойных кавычках в файле TSV? - PullRequest
0 голосов
/ 02 октября 2019

У меня есть файл TSV, который при дальнейшей проверке иногда содержит вкладки в некоторых строковых полях в двойных кавычках для некоторых строк (кажется, что они произвольно встречаются в разных строковых полях) и хотел бы удалить ихв баш. Например. при просмотре файла с :set list в vi я вижу что-то вроде ...

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?

Ответы [ 2 ]

2 голосов
/ 02 октября 2019

Если у вас есть 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 производит вывод через табуляцию.

Значение FPAT, которое я дал здесь, определяет поля как:

  • двойная кавычка
  • , за которой следуетлюбое количество:
    • две двойные кавычки
    • или любое количество символов, которые не являются двойными кавычками
  • с последующими двойными кавычками

или:

  • любое количество символов, не являющихся символами табуляции

Обратите внимание, что gawk не может обрабатывать встроенные символы новой строки в полях.

См .: https://www.gnu.org/software/gawk/manual/html_node/Splitting-By-Content.html

0 голосов
/ 02 октября 2019

Это не самое надежное решение, но, возможно, вы можете использовать его в качестве отправной точки.

sed -e 's/\("[^\t"]*\)\t\([^\t"]*\)"/\1 \2/g' tsv_file.txt

Я думаю, что для правильного решения потребуется небольшой анализатор текста, который, вероятно, будет лучше написанна таком языке, как Perl или Python.

...