Пробел с grep? - PullRequest
       11

Пробел с grep?

1 голос
/ 08 марта 2019

У меня есть CSV-файл, подобный следующему:

Monday
Tuesday
Wednesday
Thursday
Friday

Я хотел бы проанализировать другой CSV-файл с помощью CSV-файла с указанием дней недели.Мой сценарий займет понедельник, проанализирует файл и извлечет все строки, содержащие слово понедельник, затем переключится на вторник и т. Д. *

Я использую эту команду для этого:

grep -wf daysfile.csv myothercsv.csv > file.csv

Эта команда работает довольно хорошо, но в результате получается:

Monday XXXX XXX XXX
Monday XXXX XXX XXX
Monday XXXX XXX XXX
Monday XXXX XXX XXX
Tuesday XXXX XXXX XXXX
Tuesday XXXX XXXX XXXX
Tuesday XXXX XXXX XXXX
Tuesday XXXX XXXX XXXX
Tuesday XXXX XXXX XXXX
Wednesday XXXX XXXX XXXX
Wednesday XXXX XXXX XXXX
Wednesday XXXX XXXX XXXX
Wednesday XXXX XXXX XXXX

Но я хотел бы иметь пробелы, подобные этому:

Monday XXXX XXX XXX
Monday XXXX XXX XXX
Monday XXXX XXX XXX
Monday XXXX XXX XXX

Tuesday XXXX XXXX XXXX
Tuesday XXXX XXXX XXXX
Tuesday XXXX XXXX XXXX
Tuesday XXXX XXXX XXXX

Можете ли вы помочь мне?

Ответы [ 4 ]

1 голос
/ 08 марта 2019

Просто перенаправьте вывод команды grep на

perl -ape 'print "\n" if $previous and $previous ne $F[0]; $previous = $F[0]'
  • -p, считывает строку ввода построчно и печатает каждую строку после обработки
  • -a разбивает каждую строку вводав массив @F
0 голосов
/ 08 марта 2019

Я не уверен, как grep -wf daysfile.csv myothercsv.csv работает для вас, как вы описали. Данные в myothercsv.csv уже должны быть отсортированы по дням недели, поскольку команда grep просто напечатает любую строку, содержащую любое совпадающее слово в daysfile.csv, в порядке их упорядочения.

Если вы хотите искать каждое слово в daysfile.csv последовательно, то вам, вероятно, нужно следующее:

cat daysfile.csv | while read line; do grep "$line" myothercsv.csv; done

Затем вы можете применить другие ответы, которые относятся к добавлению пустых строк (при обнаружении другого первого слова) к выводу.

Кроме того, другой способ сделать это - вставить пустую строку в файл myothercsv и вставить строки ^$ в ваш дневной файл. Вот пример, обратите внимание, что первая строка в файле myothercsv пустая.

$ cat daysfile.csv
mon
^$
tue
^$
wed
^$

$ cat myothercsv.csv

mon,1
tue,2
wed,3
mon,4
tue,5
wed,6

$ cat daysfile.csv | while read line; do grep "$line" myothercsv.csv; done
mon,1
mon,4

tue,2
tue,5

wed,3
wed,6
0 голосов
/ 08 марта 2019

Использование awk

grep -wf daysfile.csv myothercsv.csv |awk -F: '{if(f!=$1)print ""; f=$1; print $0;}'

Monday XXXX XXX XXX
Monday XXXX XXX XXX
Monday XXXX XXX XXX
Monday XXXX XXX XXX

Tuesday XXXX XXXX XXXX
Tuesday XXXX XXXX XXXX
Tuesday XXXX XXXX XXXX
Tuesday XXXX XXXX XXXX
Tuesday XXXX XXXX XXXX

Wednesday XXXX XXXX XXXX
Wednesday XXXX XXXX XXXX
Wednesday XXXX XXXX XXXX
Wednesday XXXX XXXX XXXX
0 голосов
/ 08 марта 2019

В awk не могли бы вы попробовать следующее.

your_grep_command | awk 'prev!=$1 && prev{print ""} {prev=$1;print}' 


Поскольку OP НЕ предоставил образцы, поэтому не смог его протестировать, пожалуйста, попробуйте выполнить эту команду напрямую.?Несмотря на передачу grep выходных данных для другой команды один раз, дайте нам знать.

awk 'FNR==NR{a[$0];next} prev!=$1{print ""} ($0 in a);{prev=$1}'  daysfile.csv <(sort -k1 myothercsv.csv)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...