bash добавляет содержимое двух файлов, соответствующих индексу - PullRequest
1 голос
/ 02 октября 2019

У меня есть два файла, file1

    a
    b
    c
    d
    e
    f
    g
    h
    i
    j

и file2

    b
    c zzz uuu
    d qqq lll
    a xxx ggg
    f
    b
    g
    e rrr ppp

Я бы хотел добавить содержимое файла file2 в file1, если есть совпадение числа, однакоЯ также хотел бы напечатать несоответствующие строки файла1 без изменения порядка. Следовательно, желаемый эффект:

    a xxx ggg
    b
    c zzz uuu
    d qqq lll
    e rrr ppp
    f
    g
    h
    i
    j

Соответствующий столбец также можно повторить, это не проблема, поэтому он также может быть

    a a xxx ggg
    b b
    c c zzz uuu
    d d qqq lll
    e e rrr ppp
    f f
    g g
    h h
    i i
    j j

Я пытался

    awk 'FNR==NR{a[$1]=$0;next} ($1 in a) {print a[$1],$0}' a b

но результат равен

    b b
    c c zzz uuu
    d d qqq lll
    a a xxx ggg
    f f
    b b
    g g
    e e rrr ppp

, поэтому порядок потерян и отсутствуют строки из file1, есть предложения?

Ответы [ 4 ]

2 голосов
/ 02 октября 2019

Не могли бы вы попробовать следующее.

awk 'FNR==NR{val=$1;$1="";sub(/^ +/,"");a[val]=$0;next} {print $0,a[$1]}' Input_file2 Input_file1

Объяснение:

Проверка здесь условия FNR==NR, что означает, что если значение, если FNR равно NR, то выполнить следующее. Это условие будет выполнено при чтении 1-го файла Inpit_file2.

Теперь создаем переменную с именем val, значение которой является первым полем, затем обнуляем 1-е поле и заменяем начальное пространство на NULL.

Теперь создаеммассив с именем, индекс которого является переменной val, а значение является текущей строкой.

Использование next пропустит все дальнейшие операторы отсюда.

Теперь печатает 1-е поле и затем печатает [$ 1]значение, если это значение НЕ присутствует, оно оставит пустым.

1 голос
/ 02 октября 2019

Предполагается, что настоящий файл1 отсортирован, как показано в вашем примере:

$ join -j1 -o 0,2.2,2.3 -a1 file1.txt <(sort -u file2.txt)    
a xxx ggg
b  
c zzz uuu
d qqq lll
e rrr ppp
f  
g  
h  
i  
j  
1 голос
/ 02 октября 2019

Пожалуйста, попробуйте:

awk 'FNR==NR{a=$1;$1="";b[a]=$0;next} {print $1, b[$1]}' file2 file1

Результат:

a  xxx ggg
b
c  zzz uuu
d  qqq lll
e  rrr ppp
f
g
h
i
j
0 голосов
/ 02 октября 2019

наоборот:

awk 'FNR==NR{b[$1]=$0;next} {print $0,b[$1]}' b a
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...