Как получить номер строки, если несколько строк совпадают в одном и том же порядке - PullRequest
0 голосов
/ 02 марта 2019

У меня есть файл с несколькими вхождениями строк test1 и test2.Я пытаюсь найти номера строк найденных совпадений, а также печатаю эти строки в соответствии с ЗАКАЗОМ, в котором они отображаются.Каждая строка появляется один раз в одной строке.

Вот пример:

cat input.txt
this is test1
this is not
this is test2
this is test1

Моя наивная попытка получить номера строк (и порядок) равна

grep -n 'test1' input.txt  | cut -d : -f1 > output1.txt
grep -n 'test2' input.txt  | cut -d : -f1 >> output1.txt
sort -k1n output1.txt

Это вывод

cat output1.txt
1
3
4

и затем для печати с использованием цикла do-while

while read line; do
 if [[ $line =~ test1 || $line =~ test2 ]] ; then
 echo $line >> output2.txt;
done <input.txt

Вывод выглядит

cat output2.txt
this is test1
this is test2
this is test1

У меня вопрос, есть лиэто лучший (и, вероятно, эффективный) способ для этого решения, в частности получение номеров строк в правильном порядке.Благодаря.

Ответы [ 2 ]

0 голосов
/ 02 марта 2019

grep сам может сделать это, зачем?

$ grep -E 'test1|test2' input.txt     
this is test1                         
this is test2                         
this is test1                         

Если вам нужны номера строк, а также содержимое:

$ grep -nE 'test1|test2' input.txt    
1:this is test1                       
3:this is test2                       
4:this is test1                       

$ grep -nE 'test[12]' input.txt       
1:this is test1                       
3:this is test2                       
4:this is test1              

Или grep 'test[12]' input.txt и grep -n 'test[12]' input.txt.

И sed способ:

sed -n '/test[12]/p' input.txt 

только для номеров строк:

sed -n '/test[12]/=' input.txt

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

awk '/test[12]/{
    print FNR >"output1.txt"         #line numbers to output1.txt
    print >"output2.txt"             #contents to output2.txt
    print FNR ":" $0 >"output3.txt"  #both to output3.txt
}' input.txt
0 голосов
/ 02 марта 2019

1-е решение: Не могли бы вы попробовать следующее.Он будет помещать только номера строк в выходной файл output1.txt.

awk '/this is test[0-9]+/{print FNR}' Input_file > "output1.txt"

Чтобы получить номера строк и содержимое в разных выходных файлах (output1.txt, output2.txt), попробуйте выполнить следующее.

awk '/this is test[0-9]+/{print FNR > "output1.txt";print $0 > "output2.txt"}' Input_file


2-е решение: Или черпать вдохновение из комментария @kamil cuk и немного улучшить его, чтобы получить только номера строк.

grep -n 'test1\|test2' Input_file | cut -d':' -f1 > "output1.txt"
OR
grep -n 'this is test1\|this is test2' Input_file | cut -d':' -f1 > "output1.txt"

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

grep -n 'this is test1\|this is test2' Input_file | cut -d':' -f2 > "output2.txt"


3-е решение: Использование sed:

Чтобы получить только номера строк, используйте:

sed -n '/test[12]/{=;}'  Input_file > "output1.txt"

Чтобы получить содержимое строк:

sed -n '/test[12]/p' Input_file > "output2.txt"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...