2017-02-02 11 views
0

Мне нужно объединить 2 файла в один с 2 столбцами, это должно быть сделано в терминале (linux). Я гугле много, и нашли решение "паста"объединить два не равных файла в linux

пастообразных f1 f2> f3

Но результат не так, вот файлы:

f1

1,2.46 
2,5.67 
3,2.53 
4,1.07 
5,4.24 
6,18.11 
7,8.02 
8,7.25 
9,4.49 
10,2.72 

f2

1000001,1.77 
1000002,3.75 
1000003,1.38 
1000004,4.67 
1000005,3.42 
1000006,2.97 
1000007,9.24 
1000008,4.16 
1000009,1.75 
1000010,5.72 
1000011,2.18 
1000012,2.14 
1000013,2.51 
1000014,1.60 
1000015,2.85 

1,2.46 
    1000001,1.77 
2,5.67 
    1000002,3.75 
3,2.53 
    1000003,1.38 
4,1.07 
    1000004,4.67 
5,4.24 
    1000005,3.42 
6,18.11 
    1000006,2.97 
7,8.02 
    1000007,9.24 
8,7.25 
    1000008,4.16 
9,4.49 
    1000009,1.75 
10,2.72 
    1000010,5.72 
    1000011,2.18 
    1000012,2.14 
    1000013,2.51 
    1000014,1.60 
    1000015,2.85 

Это просто главы файлов f1 имеет 300000 записей, а f2 имеет записи 1M. Также я знаю, что для этого можно использовать awk. Я хотел бы сделать это с помощью «AWK»

+3

В ваших файлах есть control-Ms. Запустите 'dos2unix' или подобное в ваших входных файлах, чем попробуйте снова« вставить ». Если у вас все еще есть проблема, то [изменить] ваш вопрос, чтобы показать ожидаемый результат - пока вы только что показали нам один формат вывода, который вы НЕ хотите. –

+0

Я буду использовать awk для своих файлов, но проблема «dos2unix» решена с ошибкой. – Roman

ответ

0

попробовать это -

#awk 'BEGIN{FS=","} NR==FNR{a[NR]=$1FS$2;next} {print $0,a[$1]}' f2 f1 
    1,2.46 1000001,1.77 
    2,5.67 1000002,3.75 
    3,2.53 1000003,1.38 
    4,1.07 1000004,4.67 
    5,4.24 1000005,3.42 
    6,18.11 1000006,2.97 
    7,8.02 1000007,9.24 
    8,7.25 1000008,4.16 
    9,4.49 1000009,1.75 
    10,2.72 1000010,5.72 
+0

Хотя это мое предположение, но я думаю, что OP тоже нуждается в тех строках, которые идут после соответствующего количества строк из файла f1. – RavinderSingh13

0

@Soman: на основе предположений, которые, как (вы хотите, чтобы напечатать все строки f1 и f2 вместе (где первая линия будет иметь f1, а затем второй будет иметь f2, который будет иметь вкладку при печати его), то все дополнительные линии есть в f2 файл должен быть напечатан на один выстрел в конце концов.

awk 'FNR==NR{A[FNR]=$0;next} A[FNR]{print A[FNR] ORS "\t" $0;} !A[FNR]{B[++i]=$0} END{for(j=1;j<=i;j++){print "\t" B[j]}}' f1 f2 

Объяснение : FNR == Состояние NR будет TRUE whe n создается первый файл с именем f1. создавая массив A, индексом которого является FNR и помещающим его значение в текущую строку, где next будет пропускать все дальнейшие утверждения. СЕЙЧАС, когда условие FNR == NR НЕ ИСТИННО (означает, что второй файл читается с именем f2), тогда я проверяю, присутствует ли текущий номер строки в массиве A, а затем напечатать значение A (которое из файла f1), а затем распечатать новую строку с вкладкой и значением текущей строки f2. Затем, делая! [FNR], я проверяю, имеет ли файл f2 больше строк, чем файл f1, затем создает массив с именем B, индекс которого является переменной I (значение которого увеличивается) и устанавливает его значение в текущую строку файла f2.

В разделе END awk, начиная цикл, который выполняется до значения I и печатает значения массива B, которые фактически являются теми значениями, которые являются только из файла f2.

Если у вас есть какие-либо другие требования, добросовестно упомяните их, чтобы мы могли помочь в этом.