#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».