Если говорить конкретно о том, почему ваш синтаксис 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
Вы можете использовать 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]
, которое содержит первое поле из первого файла с тем же ключом . ].
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