Я хочу найти некоторые строки/слова из столбцов 1 и 2 в файле 1, которые соответствуют столбцу 1 в файле 2, и заменить строками/словами столбца 2 в файле 2

#linux #awk #sed

#линукс #awk #сед

Вопрос:

Я все еще изучаю кодирование с использованием платформы Linux. Я искал проблемы, похожие на мои, но как только я обнаружил, что они были либо конкретными, либо были сосредоточены только на изменении всего столбца 1.

Вот примеры моих файлов:

Файл 1

 abc Gamma 3.44 bcd abc 5.77 abc Alpha 1.99 beta abc 0.88 bcd Alpha 5.66  

Файл 2

 Gamma Bacteria Alpha Bacteria Beta Bacteria  

Выходной файл3

  abc Bacteria 3.44 bcd abc 5.77 abc Bacteria 1.99 Bacteria abc 0.88 bcd Bacteria 5.66  

Я пытался: awk:

 $ awk 'FNR==NR{a[$1]=$2;next} {if ($1,$2 in a){$1,$2=a[$1,$2]}; print $0}' file2 file1 $ awk 'NR==FNR {a[FNR]=$0; next} /$1|$2/ {$1 $2=a[FNR]} 1' file2 file1  

Они дали мне:

 abc Gamma 3.44 abc 5.77 abc Alpha 1.99 Bacteria abc 0.88 bcd Alpha 5.66  

Только измените значение $1 и удалите другие текстовые строки в столбце 1, которые не найдены в файле 2 $2

И этот:

 $ awk -F't' -v OFS='t' 'FNR==1 { next }FNR == NR { file2[$1,$2] = $1 FS $2 } FNR != NR { file1[$1,$2,] = $1 FS $2} END { print "Match:"; for (k in file1) if (k in file1) print file2[k] # Or file1[k]}' file2 file1  

Не сработало

Затем, после того как я попробовал sed:

 $ sed = file2 | sed -r 'N;s/(.*)n(.*)/1s|amp;$|2|/' | sed -f - file1  

Это дало мне ошибку и пожаловалось на то, что sed-e не вызывается должным образом.

Затем после возьмите только самые маленькие $3, если $1 и $2 или $2 и $1 похожи

файл 4

 bcd abc 5.77 Bacteria abc 0.88 bcd Bacteria 5.66  

Я попробовал этот код:

 $ awk 'NR == $1amp;$2 || $3 lt; min {line = $0; min = $3}END{print line}' file3 $ awk '/^$1/{if(h){print h RS m}min=""; h=$0; next}min=="" || $3 lt; min{min=$3; m=$0}END{print h RS m}' file3 $ awk -F't' '$3 != "NF==min"' OFS='t' file3 $ awk -v a=NODE '{c=a*$3 (1-a)} !($1 in min) || clt;min[$1]{min[$1]=c; minLine[$1]=$0} END{for(k in minLine) print minLine[k]}' file3 | column -t  

Все это не сработало, и я попытался выяснить, что означает каждая строка, и изменил ее в соответствии со своей проблемой. Но все они потерпели неудачу

Ответ №1:

Это может сработать для вас (GNU sed):

 sed -E 's#(.*) (.*)#/^1 /Is/\S /2/;/^\S  1 /Is/\S /2/2#' file2 | sed -Ef - file1  

Создайте сценарий sed из файла 2, который запускается в файле 1 для создания требуемого формата.

Комментарии:

1. Я попробовал сценарий sed, я получаю эту ошибку: sed: файловая строка 172: неизвестная команда: `2′

2. @David есть ли в файле 2 что-нибудь, кроме слов?

3. Да, в столбце file2 есть названия видов как «Escherichia~coli~2», а также файл 1 в обоих столбцах 1 и 2, они такие

4. @Дэвид, а как насчет 172-й линии? Возможно, некоторые символы придется экранировать по мере их появления в регулярном выражении.

5. В строке 172 есть «Энтеробактерии~sp~DT571/2» , которые будут жаловаться на это «/2».