Как использовать команду вырезать вместе с текстовым классификатором - PullRequest
1 голос
/ 19 октября 2019

У меня есть текстовые файлы, которые содержат значения, разделенные запятыми. Примеры форматов файлов:

cat abc.txt
A,B,C,D

cat xyz.txt
A,"1,2,3",C,D

Я хочу вырезать второй столбец из этих файлов, разделенных запятой.

Когда я использую команду вырезания, я получаю следующий вывод:

cut -d',' -f2 abc.txt
B

Это правильный и ожидаемый результат

cut -d',' -f2 xyz.txt
"1

Это не правильно. Ожидаемый результат - "1,2,3" или 1,2,3

Есть ли способ, которым мы можем вырезать второй столбец из xyz.txt, используя "" в качестве квалификатора текста. Так что запятые внутри "" будут пропущены?

Ответы [ 3 ]

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

Вы можете использовать FPAT функциональность gawk, попробуйте следующее. Поскольку вы используете cut Я предполагаю, что вы также можете использовать awk.

awk -v FPAT="([^,]+)|(\"[^\"]+\")" '{print $2}'  Input_file

Добавление информации FPAT из поля переменной из man awk следующим образом:

FPAT: регулярное выражение, описывающее содержимое полей в записи. Когда установлено, gawk анализирует входные данные в поля, где поля соответствуют регулярному выражению, вместо использования значения переменной FS в качестве разделителя полей.

ПРИМЕЧАНИЕ. Согласно предупреждению @Walter A вкомментарии остерегаются 1-го пустого поля здесь с этим решением.

1 голос
/ 19 октября 2019

Вы можете использовать PowerShell и следующую команду для достижения этого:

Import-Csv -Path C:\Temp\abc.txt -Header H1, H2, H3, H4 |
  Select-Object -ExpandProperty H2

Команда Import-Csv импортирует ваш файл как CSV и добавляет несколько случайных заголовков (-Header H1, H2, H3, H4), потому что файл неесть какой-либо. После этого он выделит и развернет второй столбец (Select-Object -ExpandProperty H2).

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

В GNU sed 4.4 это работает

sed -r 's/(("[^"]*")|([^,]*)),(("[^"]*")|([^,]*)).*/\4/' xyz.txt

Объяснение:
Option -r: избегать обратной косой черты
("[^"]*",): строка в двойных кавычках (также поддерживается первое поле в кавычках, например"A,a,a",B,C,D).
([^,]*): если поле в кавычках не найдено, совпадать до следующей запятой.
(("[^"]*")|([^,]*)): сопоставить одно поле в одном из указанных выше форматов.
,: просто, между первым и вторым полем.
(("[^"]*")|([^,]*)),(("[^"]*")|([^,]*)): (первое поле) запятая (второе поле)
.*: сопоставить оставшуюся часть строки (заменить ничем)
\4:4-й запоминающийся матч

...