Слово печати, которое не содержит символ

Я думаю, что iftop стоит попытки.

1
27.03.2012, 17:45
6 ответов

Попробуйте что-то вроде этого:

tr ',' '\n' < file.txt | grep -v \!
5
27.01.2020, 23:10
  • 1
    , относительно которого Это, кажется, не дает вывод, который попросили (разделяет вывод с новыми строками вместо пробелов). –  Chris Down 27.03.2012, 17:55
  • 2
    вывод в примере OP разделяется новыми строками. –  Tim Kennedy 27.03.2012, 17:57
  • 3
    @TimKennedy Гм, это не было, когда я смотрел. –  Chris Down 27.03.2012, 17:59
  • 4
    btw это решение является лучшим в скорости. Я протестировал все варианты из ответов, и для 5 000 повторений tr+grep занял 1-е место с 16,194 с, следующий является гну grep с 19,171 с. 3-е место чистый sed 20,514 с. 4-й awk (22,211 с), затем жемчуг (46,068 с) и последняя является shell+sed (714,402 с). –  rush 27.03.2012, 19:25

Предположение, что Вы действительно имели в виду...

test
column
no
column

... вот awk решение:

awk -v RS=, '{ for (i=1; i<=NF; i++) if($i !~ /!/) print $i; }'
3
27.01.2020, 23:10

требует GNU grep:

grep -oP '(?<=^|,)[^!]+(?=,|$)'

на основе Вашего входа, который сообщает:

test
column
no
column

Если Вы не хотите, чтобы "столбец" появился дважды: grep -oP '(?<=^|,)[^!]+(?=,|$)' | sort -u

3
27.01.2020, 23:10

Perl сделан для подобных задач. Как насчет этого жемчуга (v5.10 и выше) один лайнер:

perl -aF, -nE 'for (@F) { say $_ unless m/!/ }'

  • - для режима авторазделения
  • - F, разделение ввело строки на запятой
  • - n автоматически вводят код для итерации по входным строкам, автоматически не печатать
  • - E выполняются предоставленный на код в цикле

Если у Вас есть более старый жемчуг, просто сделайте это: s/-E/-e/, s/say/print/

2
27.01.2020, 23:10

принятие Вашего текстового файла test.txt, следующее:

for word in $(cat test.txt | sed -e 's/,/ /g'); do if [ ! "$( echo "$word" | grep '\!' )" == "$word" ]; then echo "$word"; fi; done

дает мне:

test
column
no
column
1
27.01.2020, 23:10
  • 1
    Стоит отметить, что искажения замены процесса вводят. (Кроме того, нет никакой потребности создать подоболочки из cat и echo, можно просто использовать herestrings/heredocs.) –  Chris Down 27.03.2012, 17:58

также в чистом sed существует решение

sed 's/\([,]\)*[^,]*![^,]*[,]*/\1/g;s/,$//;s/,/\n/g' file.txt
1
27.01.2020, 23:10

Теги

Похожие вопросы