Как найти значения в файле, который соответствует другому файлу, и распечатать все в последнем?

С помощью coreutils вы можете преобразовать пробелы во вкладки с помощью tr, а затем преобразовать вкладки обратно в несколько пробелов с помощью expand:

.
$ tr ' ' '\t' < file | expand
0       1       2       3       4       1       0       0
1       2       3       5       0       1       0       0

Позиции табуляции по умолчанию составляют 8 пробелов, но вы можете изменить это, например.

$ tr ' ' '\t' < file | expand -t 10
0         1         2         3         4         1         0         0
1         2         3         5         0         1         0         0
1
15.08.2019, 18:01
3 ответа

Использование сценария оболочки:

#!/bin/sh

file1=./file_1
file2=./file_2

while read -r n; do
    v=$(awk -v n="$n" '$2 ~ n {print $1}' "$file1")
    printf '%s "%s"\n' "$v" "$n"
done <"$file2"

обратите внимание:это выведет весь вывод на стандартный вывод.

Будет прочитана каждая строка в file_2и установлено значение n. Затем он прочитает file_1и найдет строку, в которой значение nсуществует в столбце 2, и напечатает столбец 1, установив его в переменную v. Затем он напечатает nи vв нужном вам формате, который можно перенаправить по вашему желанию.


Чтобы создать файл:

#!/bin/sh

file1=./file_1
file2=./file_2

while read -r n; do
    v=$(awk -v n="$n" '$2 ~ n {print $1}' "$file1")
    printf '%s "%s"\n' "$v" "$n"
done <"$file2" > file_3

Однако, поскольку вы хотите добавить эти значения в file_2, вы можете просто перезаписать file_2на file_3, однако я рекомендую выполнить вышеуказанное перед этим, чтобы убедиться, что он дает правильные результаты. Также не помешает сделать резервную копию file_1и file_2перед внесением каких-либо изменений.

#!/bin/sh

file1=./file_1
file2=./file_2

while read -r n; do
    v=$(awk -v n="$n" '$2 ~ n {print $1}' "$file1")
    printf '%s "%s"\n' "$v" "$n"
done <"$file2" > file_3

mv file_3 "$file2"
1
27.01.2020, 23:17

Как насчет

awk '
  NR==FNR {a[substr($2,2,length($2)-2)] = $0; next} 
  {print a[$1]}
' file_1 file_2
4.96798703303702 "YPL223C"
3.66402710414498 "YBR117C"
4.96798703303702 "YPL223C"
3.66402710414498 "YBR117C"
5.79159144125629 "YMR175W"
5.79159144125629 "YMR175W"
3
27.01.2020, 23:17

Пробовал с приведенным ниже сценарием и работал очень хорошо

for i in `cat file2`; do j=`sed -n '/'$i'/p' file1|awk '{print $1}'`; k=`awk -v i="$i" '$1 == i {print $0}' file2|sort | uniq| awk '{print NF}'`; if [[ $k == 1 ]]; then sed -i "/$i/s/.*/& $j/g" file2; fi; done

выход

YPL223C 4.96798703303702
YBR117C 3.66402710414498
YPL223C 4.96798703303702
YBR117C 3.66402710414498
YMR175W 5.79159144125629
YMR175W 5.79159144125629
0
27.01.2020, 23:17

Теги

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