Сравните второй столбец двух текстовых файлов и распечатайте первые столбцы обоих файлов, если они совпадают

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

Этот синтаксис работает для меня:

sed -i.old "1s;^;$(cat random)\\
;" filename

Если вы используете GNU sed, это также будет работать:

sed -i.old "1s;^;$(cat random)\n;" filename

Обращаясь к вашему редактированию и сосредотачиваясь на GNU sed, на ум приходят два решения:

1 )избегайте синтаксиса внутри random, который беспокоит sed. В вашем конкретном случае это использование буквальной новой строки внутри файла.

Вместо:

/* line1 
   line2 */

Код новой строки (в конце строки 1 )как\n:

/* line1\n   line2 */

Последняя новая строка вrandom(в конце строки 2 )— это , уже закодированная как \nв командной строке sed.

2 )отказаться от редактирования места -с помощью sedи использовать подход «cat- и -mv»:

for f in filename; do
    mv $f $f.old
    cat random $f.old > $f
done
1
14.01.2021, 22:28
2 ответа

Вы можете использовать joinздесь:

join -j 2 -o 1.1 2.1 <(sort -nk2,2 nid8.txt) <(sort -nk2,2 nid9.txt)

Используйте второе поле -j 2в обоих файлах в качестве ключей.

и -oвыводят эти поля:
первое поле из первого файла1.1
первое поле из второго файла2.1

joinтребует сортировки входных файлов, поэтому мы сортируем их по второму полю, которое будет использоваться в качестве численного ключа sort -nk2,2 input.


Использование awk, которое не требует сортировки входных данных, но загружает первый входной файл в память:

awk '!second_file{ my_array[$2]=$1; next }
     ($2 in my_array) { print $1, my_array[$2] }' nid8.txt second_file=1 nid9.txt

с my_array[$2]=$1мы сохраняем первый столбец первого входного файла nid8.txt только там, где ключи являются вторым столбцом того же первого файла, пока second_fileзначение переменной не установлено на 1 , что приводит к тому, что значение выражения !second_fileоценивается как false и не будет выполнять этот блок для следующего ввода (s ).

С условием ($2 in my_array)мы проверяем, существует ли второе поле в нашем массиве мой _массив или нет,если он существует, то мы печатаем первое поле$1(из второго файла )и значение для того же ключа с my_array[$2], которое содержит первое поле из первого файла с тем же ключом . ].

2
18.03.2021, 22:36
step1:
awk 'NR==FNR{a[$2];next}($2 in a){print $1}' nid9.txt nid8.txt >output_1.file

step2:
awk 'NR==FNR{a[$2];next}($2 in a){print $1}' nid8.txt nid9.txt >output_2.file

step3:

paste output_1.file output_2.file

выход

1000    2000
1001    2001
1002    2003
1004    2004
1005    2005
-1
18.03.2021, 22:36

Теги

Похожие вопросы