2017-01-18 1 views
0

Пытается использовать awk для поиска строки в file1 (которая всегда только 1 поле) в той же строке file2. То есть, если строка 1 используется в file1, тогда только строка 1 используется в file2. Поскольку возможно, что значение отсутствует, это проверка, чтобы убедиться, что она есть. Это просто идея, поэтому, вероятно, лучший способ, но я просто хотел посмотреть. Спасибо :).awk для хранения и сброса переменной из файла

файл1

R_2017_01_13_12_11_56_user_S5-00580-24-Medexome 
R_2017_01_13_14_46_04_user_S5-00580-25-Medexome 

файл2

The oldest folder is R_2017_01_13_12_11_56_user_S5-00580-24-Medexome, created on 2017-01-17+11:31:02.5035483130 and analysis done using v1.4 by cmccabe at 01/17/17 12:41:03 PM 

требуемый выход для $filename

R_2017_01_13_12_11_56_user_S5-00580-24-Medexome 

После того, как куча процессов выполняются с помощью $filename, мне нужно сбросить эту переменную с новой.

файл1 (после повторного некоторый процесс)

R_2017_01_13_12_11_56_user_S5-00580-24-Medexome 
R_2017_01_13_14_46_04_user_S5-00580-25-Medexome 

файл2 (после повторного некоторый процесс)

The oldest folder is R_2017_01_13_12_11_56_user_S5-00580-24-Medexome, created on 2017-01-17+11:31:02.5035483130 and analysis done using v1.4 by cmccabe at 01/17/17 12:41:03 PM 
The oldest folder is R_2017_01_13_14_46_04_user_S5-00580-25-Medexome, created on 2017-01-17+06:53:07.3194950000 and analysis done using v1.4 by cmccabe at 01/18/17 06:59:08 AM 

требуемый выход для $filename теперь (так как это значение является новым)

R_2017_01_13_14_46_04_user_S5-00580-25-Medexome 

AWK

filename=$(awk 'NR==1{print $1}' file1 file2) 
+0

так что вы хотите напечатать последний элемент из файла1, который встречается в той же строке, что и в файле2? – fedorqui

+0

С другой стороны, я думаю, так как 'file1' может иметь несколько значений в нем, но' file2' будет иметь только один, пока он не будет обновлен новым процессом. Спасибо :). – Chris

+0

, поэтому вам всегда нужно проверить _just_ последнюю строку в файле2? – fedorqui

ответ

2

Вы хотите проверить, если последняя строка file2 содержит строка, указанная в файле1.

Для этого вам просто нужно прочитать эту последнюю строку, а затем посмотреть, совпадает ли она с любым из слов в файле1.

$ awk 'ENDFILE {line=$0} FNR<NR && line ~ $1' file2 file1 
R_2017_01_13_14_46_04_user_S5-00580-25-Medexome 

Это использует:

  • ENDFILE {line=$0}
    после чтения файла, $0 содержит последнюю строку, которая была читать (ну, not always, но я предполагаю, что у вас есть современная версия awk, т.к. ENDFILE - расширение GNU awk). При этом мы сохраняем эту последнюю строку в line, чтобы мы могли использовать ее при чтении следующего файла.

  • FNR<NR && line ~ $1
    при чтении file1, проверьте, если данное слово присутствует в сохраненной линии. Если это так, автоматически запускается print.
    Использует трюк FNR<NR, где FNR содержит номер строки в текущем файле, а NR - количество строк в общем. Таким образом, FNR==NR действует только при чтении первого файла и FNR<NR со второго.

+1

NIce [это наполнитель]. –

+0

Как это значение может быть сохранено в переменной $ filename или если файл создан, который сохраняет эту строку, которая может использоваться последующими сценариями? Спасибо :). – Chris

+1

@ Крис, конечно, просто скажите 'filename = $ (awk 'ENDFILE {line = $ 0} FNR fedorqui

1

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

$ awk 'NR==FNR{a[$1];next}{for(i in a)if(i ~ $0) print i}' file1 <(tail -f file2) 

Разъяснение:

  • NR==FNR{a[$1];next} считаны в a массив поисковые запросы от file1
  • file2 является tail -f 'd в awk, используя замену процесса, т.е. он читает запись с конца file2, проходит через все поисковые слова в a и смотрит их из записи, печати слово для поиска, если есть совпадение
Смежные вопросы