2013-09-24 3 views
1

У меня есть два файла, которые я пытаюсь объединить/объединить на основе столбцов 1 и 2. Они выглядят примерно так: «файл 1» намного короче файла 2, и я хотел бы найти пересечение этих двух файлов: и в случае, если записи не совпадают, последний столбец необходимо обновить с помощью другой строки.должным образом объединить два файла на основе двух столбцов:

Пример ниже:

Файл 1:

1047 510 75 Live 
1048 510 75 Live 
1049 510 75 Live 
1627 510 75 Live 
1628 510 75 Live 
1629 510 75 Live 

Файл 2:

1047 510 75 Live 
1048 510 75 Live 
1049 510 75 Live 
107  510 39 Live 
108  510 39 Live 
109  510 39 Live 
117  510 39 Live 
118  510 39 Live 
119  510 39 Live 
1627 510 75 Live 
1628 510 75 Live 
1629 510 75 Live 
17  510 75 Live 

Цель: Файл 3

1047 510 75 Live 
1048 510 75 Live 
1049 510 75 Live 
107  510 39 Test 
108  510 39 Test 
109  510 39 Test 
117  510 39 Test 
118  510 39 Test 
119  510 39 Test 
1627 510 75 Live 
1628 510 75 Live 
1629 510 75 Live 
17  510 75 Test 
+0

Каким должен быть выход, если во втором файле выше существовал '1047 510 39 Live'? Должна ли это строка из файла1 или строка из файла2 или две строки или что-то еще? –

+0

@Imran - Добро пожаловать в SO! Что вы пытались сделать до сих пор? Вы не можете получить большую помощь, если не проиллюстрируете, какие попытки вы предприняли для слияния самостоятельно. – Derek

+0

Файл 1 и файл 2: первые 2 столбца каждого файла составляют первичный ключ и должны использоваться для сравнения этих двух файлов. Сравните записи файла 2 с файлом 1. Если запись присутствует в файле 1, замените запись в файле 2 записью, найденной в файле 1 Если запись не найдена в файле 1, обновите только последний столбец этой записи в файле 2. Надеюсь, это ясно. – Imran

ответ

4

два подхода.

Используйте comm, чтобы получить соединение и различия:

{ 
    # lines in common 
    comm -12 <(sort file1) <(sort file2) 
    # lines only in file2 
    comm -13 <(sort file1) <(sort file2) | awk '{$NF="Test"} 1' 
} > file3 

Или просто палка с AWK

awk ' 
    # read and store file1 
    NR==FNR {f1[$0]; next} 
    # for file2 lines not in file1, alter the last field 
    !($0 in f1) {$NF = "Test"} 
    # print each line 
    1 
' file1 file2 > file3 

Вы можете перенаправить вывод через column -t приукрасить file3:

awk '...' file1 file2 | column -t > file3 
+0

Привет Гленн. Спасибо за ваш ответ. моя проблема немного сложнее. У меня есть два файла: Файл 1 и файл 2 первые 2 столбца каждого файла делают первичный ключ и должны использоваться для сравнения этих двух файлов. Сравните записи файла 2 с файлом 1. если запись присутствует в файле 1, замените запись в файле 2 записью, найденной в файле 1 Если запись не найдена в файле 1, обновите только последний столбец этой записи в файле 2. Надеюсь, это ясно. – Imran

+0

Пожалуйста, добавьте дополнительные требования в вопрос. –

0

Это может сработать для вас (GNU sed):

sed -r 's|^(\S+\s+\S+\s+).*|/^\1/s/.*/&/;t|;$a\s/\\S+$/Test/' file1 | 
sed -rf - file2 >file3 

Это генерирует сценарий sed из файла1, который заменяет строки в файле2, которые соответствуют первым двум полям файла1 с содержимым соответствующей строки из файла1. Те строки, которые не соответствуют обновлению последнего столбца непревзойденной строки с Test. Результаты печатаются в файле3.

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