Согласование двух файлов и сохранение блоков, содержащих совпадение

Если это компьютер Acer, вы должны следовать процедуре здесь: Acer Aspire E15 не будет работать с двойной загрузкой. Если Ubuntu уже установлен, вам нужно просто выполнить шаги от 2 до 16 (не все из них, только то, что находится в вашей BIOS и отличается от того, что там написано), и, самое главное, шаги от 34 до 43. На шаге 40 есть небольшая ошибка, вам нужно написать grubx64efi без точки.

Вы также должны сделать это для работы сенсорной панели, если это ноутбук Acer Aspire E15 не будет двойной загрузки

1
задан 2 March 2018 в 09:04

6 ответов

Ok позволяет попробовать этот маленький скрипт, который я создал:

#!/usr/bin/env bash
set -e

match1=/home/george/Documents/askubuntu/matchme/match1
match2=/home/george/Documents/askubuntu/matchme/match2

# Create the result file
touch results.txt

while read -r word
do
     if [[ "$word" = $(grep -o "$word" "$match1") ]]; then
             if [[ "$word" != $(grep -o "$word" "results.txt") ]]
             then
                     grep "$(grep "$word" "$match1" | grep -o "[[:digit:]]..$")" "$match1" >> "results.txt"
                     while read -r new
                     do                                 
                             if [[ "$new" =~ $word ]]; then
                                     # Replace the words
                                     sed -i "s/$word/$new/" "results.txt"
                             fi
                     done < <(grep  -o "$word_.*\." "$match2" | sed -e 's/\.//')
                     # Add space between results
                     echo " " >> "results.txt"
             fi
     fi
done < <(cut -d"_" -f1 "$match2")

# Remove last blank line from the results file
sed -i '$ d' results.txt

Объяснение:

match1: содержит источник фильтра match2: содержит критерии фильтра : остановить сценарий возникает ошибка (grep -o "$word_.*\." "$match2" | sed -e 's/\.//'): прочитать файл фильтра и захватить имена до расширения pdb

Описание процесса команды:

Использование cut команда получает критерии фильтра из файла match2 (1KBA, 1A3L, 1F94, 1A3U, 1A3V, 1A4H), затем читает из результата команды cut и находит совпадения в файле источников match1, если найдено совпадение grep для этого блока в исходном файле и отправить или распечатать новый файл result.txt

ПРИМЕЧАНИЕ: Пожалуйста, измените имена и другие параметры на свой вкус.

ПРИМЕЧАНИЕ:

$cat results.txt 
3LKB_BUNMU  Bungarus multicinctus   P01398  PDB; 1KBA_GAL; X-ray; 2.30 A; A/B=22-87.
                                        PDB; 2NBT; NMR; -; A/B=22-87.

3NOJ_BUNCA  Bungarus candidus   P81782  PDB; 1F94_; X-ray; 0.97 A; A=1-63.
                                    PDB; 1IJC; NMR; -; A=1-63. 
1
ответ дан 22 May 2018 в 12:52
  • 1
    Комментарии не предназначены для расширенного обсуждения; этот разговор был перемещен в чат . – Thomas Ward♦ 2 March 2018 в 18:09
  • 2
    Эй, немного странно, но скрипт хорошо компилируется в этом примере и выполняет описанную логику, но когда я запускаю его на более крупном наборе данных, например, ... 50, он не компилируется правильно в терминах; он не заменяет имена из file 2 и удаляет непревзойденные строки. Если у вас есть какое-то время, то я могу послать туда где-нибудь эти более большие данные, чтобы проверить, что кажется неправильным? Благодаря! – sergio 5 March 2018 в 06:29

Ok позволяет попробовать этот маленький скрипт, который я создал:

#!/usr/bin/env bash set -e match1=/home/george/Documents/askubuntu/matchme/match1 match2=/home/george/Documents/askubuntu/matchme/match2 # Create the result file touch results.txt while read -r word do if [[ "$word" = $(grep -o "$word" "$match1") ]]; then if [[ "$word" != $(grep -o "$word" "results.txt") ]] then grep "$(grep "$word" "$match1" | grep -o "[[:digit:]]..$")" "$match1" >> "results.txt" while read -r new do if [[ "$new" =~ $word ]]; then # Replace the words sed -i "s/$word/$new/" "results.txt" fi done < <(grep -o "$word_.*\." "$match2" | sed -e 's/\.//') # Add space between results echo " " >> "results.txt" fi fi done < <(cut -d"_" -f1 "$match2") # Remove last blank line from the results file sed -i '$ d' results.txt

Объяснение:

match1: содержит источник фильтра match2: содержит критерии фильтра set -e: остановить сценарий возникает ошибка (grep -o "$word_.*\." "$match2" | sed -e 's/\.//'): прочитать файл фильтра и захватить имена до расширения pdb

Описание процесса команды:

Использование cut команда получает критерии фильтра из файла match2 (1KBA, 1A3L, 1F94, 1A3U, 1A3V, 1A4H), затем читает из результата команды cut и находит совпадения в файле источников match1, если найдено совпадение grep для этого блока в исходном файле и отправить или распечатать новый файл result.txt

ПРИМЕЧАНИЕ: Пожалуйста, измените имена и другие параметры на свой вкус.

ПРИМЕЧАНИЕ:

$cat results.txt 3LKB_BUNMU Bungarus multicinctus P01398 PDB; 1KBA_GAL; X-ray; 2.30 A; A/B=22-87. PDB; 2NBT; NMR; -; A/B=22-87. 3NOJ_BUNCA Bungarus candidus P81782 PDB; 1F94_; X-ray; 0.97 A; A=1-63. PDB; 1IJC; NMR; -; A=1-63.
1
ответ дан 17 July 2018 в 19:54

Ok позволяет попробовать этот маленький скрипт, который я создал:

#!/usr/bin/env bash set -e match1=/home/george/Documents/askubuntu/matchme/match1 match2=/home/george/Documents/askubuntu/matchme/match2 # Create the result file touch results.txt while read -r word do if [[ "$word" = $(grep -o "$word" "$match1") ]]; then if [[ "$word" != $(grep -o "$word" "results.txt") ]] then grep "$(grep "$word" "$match1" | grep -o "[[:digit:]]..$")" "$match1" >> "results.txt" while read -r new do if [[ "$new" =~ $word ]]; then # Replace the words sed -i "s/$word/$new/" "results.txt" fi done < <(grep -o "$word_.*\." "$match2" | sed -e 's/\.//') # Add space between results echo " " >> "results.txt" fi fi done < <(cut -d"_" -f1 "$match2") # Remove last blank line from the results file sed -i '$ d' results.txt

Объяснение:

match1: содержит источник фильтра match2: содержит критерии фильтра set -e: остановить сценарий возникает ошибка (grep -o "$word_.*\." "$match2" | sed -e 's/\.//'): прочитать файл фильтра и захватить имена до расширения pdb

Описание процесса команды:

Использование cut команда получает критерии фильтра из файла match2 (1KBA, 1A3L, 1F94, 1A3U, 1A3V, 1A4H), затем читает из результата команды cut и находит совпадения в файле источников match1, если найдено совпадение grep для этого блока в исходном файле и отправить или распечатать новый файл result.txt

ПРИМЕЧАНИЕ: Пожалуйста, измените имена и другие параметры на свой вкус.

ПРИМЕЧАНИЕ:

$cat results.txt 3LKB_BUNMU Bungarus multicinctus P01398 PDB; 1KBA_GAL; X-ray; 2.30 A; A/B=22-87. PDB; 2NBT; NMR; -; A/B=22-87. 3NOJ_BUNCA Bungarus candidus P81782 PDB; 1F94_; X-ray; 0.97 A; A=1-63. PDB; 1IJC; NMR; -; A=1-63.
1
ответ дан 23 July 2018 в 20:39

Я предлагаю использовать awk в режиме абзаца, например

awk 'NR==FNR {
       sub(/_[^_]*$/,"",$1); a[$1]++; next
     } 
     {
       for (x in a) {
         if ($0 ~ "PDB; "x) {print; break;}
       }
     }' file2 RS= file1

Пример:

$ awk 'NR==FNR {sub(/_[^_]*$/,"",$1); a[$1]++; next} {for (x in a) {if ($0 ~ "PDB; "x) {print; break;}}}' file2 RS= file1
3LKB_BUNMU  Bungarus multicinctus   P01398  PDB; 1KBA; X-ray; 2.30 A; A/B=22-87.
                                            PDB; 2NBT; NMR; -; A/B=22-87.
3NOJ_BUNCA  Bungarus candidus   P81782  PDB; 1F94; X-ray; 0.97 A; A=1-63.
                                        PDB; 1IJC; NMR; -; A=1-63. 

Если вы хотите, чтобы пустая line после каждого блока, вы можете изменить {print; break;} на {print $0"\n"; break;} или {printf "%s\n\n", $0; break}, хотя обратите внимание, что после последней записи будет добавлена ​​конечная пустая строка, где, возможно, не было одной из них - если у вас есть GNU awk (gawk ]), вы можете избежать этого, обратившись к специальной переменной RT, которая содержит фактический разделитель для каждой записи, т.е. {printf "%s%s", $0, RT; break;}

1
ответ дан 22 May 2018 в 12:52
  • 1
    Спасибо, это очень эффективный скрипт. Только один вопрос, может ли он быть изменен так, что при сопоставлении этого four letter/digit elements между этими двумя файлами файл вывода (результата) имеет сопоставленные и непревзойденные элементы (например, вывод из вашего скрипта), но чтобы сохранить эти имена файлов из второго файла на выходе (поэтому вместо 1KBA.pdb иметь 1KBA_GAL.pdb)? – sergio 28 February 2018 в 14:01

Я предлагаю использовать awk в режиме абзаца, например

awk 'NR==FNR { sub(/_[^_]*$/,"",$1); a[$1]++; next } { for (x in a) { if ($0 ~ "PDB; "x) {print; break;} } }' file2 RS= file1

Пример:

$ awk 'NR==FNR {sub(/_[^_]*$/,"",$1); a[$1]++; next} {for (x in a) {if ($0 ~ "PDB; "x) {print; break;}}}' file2 RS= file1 3LKB_BUNMU Bungarus multicinctus P01398 PDB; 1KBA; X-ray; 2.30 A; A/B=22-87. PDB; 2NBT; NMR; -; A/B=22-87. 3NOJ_BUNCA Bungarus candidus P81782 PDB; 1F94; X-ray; 0.97 A; A=1-63. PDB; 1IJC; NMR; -; A=1-63.

Если вы хотите, чтобы пустая line после каждого блока, вы можете изменить {print; break;} на {print $0"\n"; break;} или {printf "%s\n\n", $0; break}, хотя обратите внимание, что после последней записи будет добавлена ​​конечная пустая строка, где, возможно, не было одной из них - если у вас есть GNU awk (gawk ]), вы можете избежать этого, обратившись к специальной переменной RT, которая содержит фактический разделитель для каждой записи, т.е. {printf "%s%s", $0, RT; break;}

1
ответ дан 17 July 2018 в 19:54

Я предлагаю использовать awk в режиме абзаца, например

awk 'NR==FNR { sub(/_[^_]*$/,"",$1); a[$1]++; next } { for (x in a) { if ($0 ~ "PDB; "x) {print; break;} } }' file2 RS= file1

Пример:

$ awk 'NR==FNR {sub(/_[^_]*$/,"",$1); a[$1]++; next} {for (x in a) {if ($0 ~ "PDB; "x) {print; break;}}}' file2 RS= file1 3LKB_BUNMU Bungarus multicinctus P01398 PDB; 1KBA; X-ray; 2.30 A; A/B=22-87. PDB; 2NBT; NMR; -; A/B=22-87. 3NOJ_BUNCA Bungarus candidus P81782 PDB; 1F94; X-ray; 0.97 A; A=1-63. PDB; 1IJC; NMR; -; A=1-63.

Если вы хотите, чтобы пустая line после каждого блока, вы можете изменить {print; break;} на {print $0"\n"; break;} или {printf "%s\n\n", $0; break}, хотя обратите внимание, что после последней записи будет добавлена ​​конечная пустая строка, где, возможно, не было одной из них - если у вас есть GNU awk (gawk ]), вы можете избежать этого, обратившись к специальной переменной RT, которая содержит фактический разделитель для каждой записи, т.е. {printf "%s%s", $0, RT; break;}

1
ответ дан 23 July 2018 в 20:39
  • 1
    Спасибо, это очень эффективный скрипт. Только один вопрос, может ли он быть изменен так, что при сопоставлении этого four letter/digit elements между этими двумя файлами файл вывода (результата) имеет сопоставленные и непревзойденные элементы (например, вывод из вашего скрипта), но чтобы сохранить эти имена файлов из второго файла на выходе (поэтому вместо 1KBA.pdb иметь 1KBA_GAL.pdb)? – sergio 28 February 2018 в 14:01

Другие вопросы по тегам:

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