2013-11-18 3 views
1

У меня есть два файла, и я использую команду «comm -23 file1 file2» для извлечения строк, отличных от файла.извлекать разные строки из файлов с помощью Bash

Мне также потребуется что-то, что извлекает разные строки, но также сохраняет строку «line_ $ NR». Пример: файл1:

line_1: This is line0 
line_2: This is line1 
line_3: This is line2 
line_4: This is line3 

файл2:

line_1: This is line1 
line_2: This is line2 
line_3: This is line3 

мне нужен этот выход: различия file1 file2:

line_1: This is line0. 

В заключение нужно извлечь различия, как если файл не имеет строки_ $ NR в начале, но когда я печатаю результат, мне также нужно распечатать строку_ $ NR.

+0

Я хочу разницу между файлами, но без сравнения line_NR, только print line_NR. Я не знаю, подходит ли сообщение. –

+0

В вашей версии 'diff' могут быть варианты для создания сборочного сообщения' comm'. – chepner

ответ

0

Попробуйте использовать awk

awk -F: 'NR==FNR {a[$2]; next} !($2 in a)' file2 file1 

Выход:

line_1: This is line0 

Краткое описание

awk -F: '    # Set filed separator as ':'. $1 contains line_<n> and $2 contains 'This is line_<m>' 
    NR==FNR {   # If Number of records equal to relative number of records, i.e. first file is being parsed 
     a[$2];  # store $2 as a key in associative array 'a' 
     next   # Don't process further. Go to next record. 
    } 
    !($2 in a)  # Print a line if $2 of that line is not a key of array 'a' 
' file2 file1 

Дополнительное требование (В комментарии)

И если у меня есть несколько ":" в строке: "line_1: Это: это: line0" не работает. Как я могу только взять line_x

В этом случае попробуйте следующее (GNU AWK только)

awk -F'line_[0-9]+:' 'NR==FNR {a[$2]; next} !($2 in a)' file2 file1 
+0

Эта команда завершается с ошибкой, если «разница» находится в файле2. в другом слове, если оба файла имеют «разницу», awk-подход в anwer не будет работать. – Kent

+0

@Kent Согласен. Но это решение было основано на команде OP 'comm -23 file1 file2', где я считаю, что это означает, что строки уникальны для ** file1 **. Исправьте меня, если я что-то упустил. – jkshah

+0

Это правильно. На самом деле мне нужен какой-то различие между file1 и file2. Я использовал comm -23 file1 file2 и comm -23 file2 file1 –

0

это AWK строка длиннее, однако она будет работать независимо от того, где были расположены различия :

awk 'NR==FNR{a[$NF]=$0;next}a[$NF]{a[$NF]=0;next}7;END{for(x in a)if(a[x])print a[x]}' file1 file2 

тест:

kent$ head f* 
==> f1 <== 
line_1: This is line0 
line_2: This is line1 
line_3: This is line2 
line_4: This is line3 

==> f2 <== 
line_1: This is line1 
line_2: This is line2 
line_3: This is line3 

#test f1 f2 
kent$ awk 'NR==FNR{a[$NF]=$0;next}a[$NF]{a[$NF]=0;next}7;END{for(x in a)if(a[x])print a[x]}' f1 f2 
line_1: This is line0 

#test f2 f1:  
kent$ awk 'NR==FNR{a[$NF]=$0;next}a[$NF]{a[$NF]=0;next}7;END{for(x in a)if(a[x])print a[x]}' f2 f1 
line_1: This is line0 
+0

И я хочу сделать diff между файлом file2 без строки_ $ NR, а затем вставить строку_ $ NR с помощью awk? –

+0

Я не хочу, чтобы тест f2 f1 возвращал тот же результат, что и тест f1 f2. Также в файле 2 я изменил «Это строка 2» на «Это строка 5», а на выходе: «line_2: Это строка5 line_1: Это строка line_3: Это строка2" –

Смежные вопросы