Обработка файла siml-csv с помощью AWK - PullRequest
1 голос
/ 24 июня 2011

У меня есть такой файл:

 "text I don't know" command other "text" 
 "some" different text "type"

Мне нужно получить «текст, который я не знаю» и «некоторые», с помощью sed, awk или любого другого инструмента bash, чтобы передать их другой команде.

Любой намек?

Ответы [ 3 ]

0 голосов
/ 24 июня 2011
sed 's/^\("[^"]*"\).*/\1/'

Это относится к строкам, содержащим простое поле в двойных кавычках, опускающее любой дополнительный материал.Он проходит через любые строки, не соответствующие этому неизменному.

Если вы хотите удалить несоответствующие строки, то:

sed -n '/^\("[^"]*"\).*/s//\1/p'

По умолчанию не печатается и печатается, когда находитmatch.

Если вам приходится иметь дело с такими полями данных, как:

"He said, ""It's horrid""" and he meant it!

, вам придется работать значительно усерднее.Если ваш sed поддерживает расширенные регулярные выражения или PCRE (регулярные выражения, совместимые с Perl), вы можете сделать это.Если нет, используйте awk.

0 голосов
/ 25 июня 2011

Не уверен, должен ли " быть частью вывода или нет, при условии, что нет. Если я ошибаюсь, у вас не должно возникнуть никаких проблем с добавлением его в вывод (намеренно оставлено sed из списка ниже, поскольку ответ @ Jonathan-Leffler очень хороший)

Не идеальное решение, поскольку " выводится в качестве первого символа, но это просто.

cut -d\" -f1-2 input

Решение с использованием чистого bash, см. 5.1 Переменные оболочки Bourne для объяснения IFS

#!/bin/bash

IFS='"'

while read -ra LINE;
do
    echo ${LINE[1]}
done < input

Решение с использованием awk и флага -F для изменения разделителя на "

$ awk -F\" '{print $2}' input

и, наконец, один в Perl. -a включает режим автоматического разделения - perl автоматически разбивает входные строки на пустом месте в массив @F. -F используется вместе с -a, чтобы выбрать разделитель, по которому нужно разделить строки.

perl -F\" -lane 'print $F[1]' input
0 голосов
/ 24 июня 2011

Это кажется слишком простым, что означает, что вы можете быть новичком в awk.Что вполне приемлемо, или я неверно истолковал ваш вопрос.Я надеюсь, что это первое.

Следующее должно делать то, что вы просите.Установите разделитель полей на «-F\" (экранируйте» с помощью) и напечатайте второе поле, первое слева от «или ничего». Вы можете просто поставить трубу и конец строки, чтобы сделать то, что вы хотите.

awk -F\" '{print FS$2FS}' inputFile.txt

"текст, который я не знаю"
"какой-то"

FS - полевой сепаратор

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...