2017-02-14 12 views
0

У меня есть file1 в указанном ниже формате:Использование AWK для сравнения запись файла, а также состояние

14-02-2017 

one 01/02/2017 
two 31/01/2017 
three 14/02/2017 
four 01/02/2017 
five 03/02/2017 
six 01/01/2017 

И file2 в указанном ниже формате:

11-02-2017 

one 01/01/2017 
two 31/01/2017 
three 14/02/2017 
four 11/01/2017 

Требование: Я хочу, чтобы скопировать, замените (или добавьте в случае необходимости) те файлы, упомянутые в файле file1, из какого-либо места в место, где находится файл2, дата которого (в coulmn 2) больше даты, указанной в файле 2. Гарантируется, что файл 2 не будет дата программы больше, чем дата файла (но может быть равна). Также должны быть скопированы записи файлов, отсутствующие в файле 2 (но представленные в файле 1).

Так что в этом случае файлы один, четыре, пять и шесть должны быть скопированы с некоторого места к месту file2, после выполнения сценария

AWK -F» '«NR == ПЗФ {с [$ 1] ++;} следующий; C [$ 1]> 0' $ файл2 $ file1> общий

# Файл 1, колонка 2 f1c2 = ($ (вырезать -f2 -s $ общий))

# Файл 2, столбец 2 f2c2 = ($ (cut -f2 -s $ file2))

for x in "${f1c2[@]}" 
do 
    for y in "${f2c2[@]}" 
    do 
     if [[ $x >= $y ]] 
     then 

    //copy file pointed by field $1 in "common" to file2 path 

      break 
     fi 
    done 
done 

Я думал о том, как эффективно использовать awk для выполнения задачи сравнения, чтобы создать файл «общий». Так что файл «common» будет содержать последние файлы в файле 1, а также недостающие записи в файле 2. После этого мне просто нужно скопировать все файлы, упомянутые в файле «common», без каких-либо проблем.

Я был пытаюсь добавить какой-то блок внутри awk -F '' 'NR == FNR {c [$ 1] ++; next}; c [$ 1]> 0' $ file2 $ file1> общий, но я не мог понять, как для обращения к файлу 1 column2 и файлу 2 column2 для сравнения.

+0

Обязательно ли awk? – mcoolive

+0

не очень, но я думал о том, чтобы сохранить чистый вид, не имея большого количества строк кода. – user7083883

+1

Правильно ли я понимаю, что даты в файле1 являются настоящими датами файла, а те, что в файле2, представляют собой более старую ситуацию и то, что вы делаете to является некоторой формой или зеркалированием или резервным копированием? Если это так, возможно, вам нужно всего лишь один вызов 'rsync' с соответствующими параметрами. Дайте нам знать ... – Dario

ответ

0

Parse 2 файлов одновременно с awk сложно. Поэтому я предлагаю другой алгоритм: - слить файл - фильтр для сохранения соответствующих строк

Я могу предложить посмотреть команды «comm» и «join». Вот пример

comm -23 <(sort file1) <(sort file2) 
+0

У меня уже есть уникальные записи файлов в «общем» файле, используя awk-скрипт, показанный выше, но моя проблема в том, что снова мне нужно сделать обработку цикла, чтобы сравнить файл «common's» column 2 с колонкой 2 файла 2 для сравнения даты – user7083883

1

, чтобы получить дату по сравнению дифф список, вы можете попробовать это

awk 'NR==FNR {a[$1]=$2; next} 
    $1 in a {split($2,b,"/"); split(a[$1],c,"/"); 
       if(b[3]""b[2]""b[1] >= c[3]""c[2]""c[1]) delete a[$1]} 
    END  {for(k in a) print k,a[k]}' file1 file2 

six 01/01/2017 
four 01/02/2017 
five 03/02/2017 
one 01/02/2017 

и работать на результат для копирования файлов ...

Объяснение Данный файл 1 мы хотим удалить записи, в которых поле даты меньше, чем соответствующая запись в файле 2.

NR==FNR {a[$1]=$2; next} кэша содержимого файла 1

$1 in a (теперь сканирование второго файла), если запись существует в файле 1

split($2,b,"/")... даты раскола поля, так что мы можем изменить порядок в год-месяц -date для сравнения естественного порядка

if(b[3]...) delete a[$1] если дата файла 2 больше или равна одному в файле 1, удалить запись

END... распечатать оставшиеся записи, которые удовлетворят требованиям.

+0

Wow !. Он работает хорошо !, но я ничего не понял о том, как его работа (awk - это новый язык программирования? :)) – user7083883