2017-02-16 3 views
1

Существует множество потоков о передаче переменной оболочки awk, и я понял, что это достаточно легко, но переменная, которую я хочу передать, является переменной-спецификатором столбца ($1,$2 и т. Д.)Передача переменной bash для спецификатора столбца awk

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

В этом скрипте я просто сортирую и объединяю 2 файла вместе, но для того, чтобы немного начать обобщать скрипт, я хочу иметь возможность указать в командной строке поле в файле ключей, которое awk должно в качестве своего опциона сортировки.

Что я здесь делаю неправильно? (Я только схватившись с AWK и Oneliner слегка адаптировано из here

keyfile="$1" 
filetosort="$2" 
field="$3" 

awk -v a="$field" 
paste "$keyfile" <(awk 'NR==FNR{o[FNR]=a; next} {t[$1]=$0} END{for(x=1; x<=FNR; x++){y=o[x]; print t[y]}}' $keyfile $filetosort) 

EDIT Добавлен пример/вывода

Keyfile:. (10 случайных строк из файла)

PVClumt18 PAK_2199 PAK_01997 
PVClopt2 PAK_2091 PAK_01895 
PVCcif7  PAK_1975 PAK_01793 
PVClopT12 PAU_02101 PAU_02063 
PVCpnf20 PAK_3524 PAK_03184 
PVClopt3 PAK_2090 PAK_01894 
PVClopT11 PAU_02102 PAU_02064 
PVCunit2_11 plu1698  PLT_01726 
PVClumT9 afp10  PAU_02198 
PVCunit2_17 plu1692  PLT_01720 

файла сортировать:

PAU_02064 1pqx 1pqx_A 37.4 13 0.00035 31.4 >1pqx_A Conserved hypothetical protein; ZR18,structure, autostructure,spins,autoassign, northeast structural genomics consortium; NMR {Staphylococcus aureus subsp} SCOP: d.267.1.1 PDB: 2ffm_A 2m6q_A 2m8w_A 
PAK_01997 5ftj 5ftj_A 99.9 1.6e-26 4.2e-31 229.2 >5ftj_A Transitional endoplasmic reticulum ATPase; hydrolase, single-particle, AAA ATPase; HET: ADP OJA; 2.30A {Homo sapiens} PDB: 3cf1_A* 3cf3_A* 3cf2_A* 5ftk_A* 5ftl_A* 5ftm_A* 5ftn_A* 1r7r_A* 5c19_A 5c1b_A* 5c18_A* 3cf0_A* 
PAK_01894 3j9q 3j9q_A 99.9 1.8e-29 4.6e-34 215.9 >3j9q_A Sheath; pyocin, bacteriocin, sheath, structural protein; 3.50A {Pseudomonas aeruginosa} 
PAK_03184 1xju 1xju_A 99.4 4.1e-17 1.1e-21 98.8 >1xju_A Lysozyme; secreted inactive conformation, hydrolase; 1.07A {Enterobacteria phage P1} SCOP: d.2.1.3 
PAK_01793 5a3a 5a3a_A 50.8 6 0.00016 31.4 >5a3a_A SIR2 family protein; transferase, P-ribosyltransferase, metalloprotein, NAD-depen lipoylation, regulatory enzyme, rossmann fold; 1.54A {Streptococcus pyogenes} PDB: 5a3b_A* 5a3c_A* 
PLT_01720 3ggm 3ggm_A 54.2 4.9 0.00013 26.2 >3ggm_A Uncharacterized protein BT9727_2919; bacillus cereus group., structural genomics, PSI-2, protein structure initiative; 2.00A {Bacillus thuringiensis serovarkonkukian} 
PLT_01726 3h2t 3h2t_A 96.8 8e-06 2.1e-10 82.6 >3h2t_A Baseplate structural protein GP6; viral protein, virion; 3.20A {Enterobacteria phage T4} PDB: 3h3w_A 3h3y_A 
PAK_01895 3j9q 3j9q_A 100.0 2.5e-35 6.4e-40 248.6 >3j9q_A Sheath; pyocin, bacteriocin, sheath, structural protein; 3.50A {Pseudomonas aeruginosa} 
PAU_02198 4jiv 4jiv_D 69.6 1.6 4.2e-05 27.5 >4jiv_D VCA0105, putative uncharacterized protein; PAAR-repeat motif, membrane piercing, type VI secretion SYST vibrio cholerae VGRG2; HET: PLM STE ELA; 1.90A {Vibrio cholerae o1 biovar eltor} 
PAU_02063 4yap 4yap_A 31.1 20 0.00052 29.1 >4yap_A Glutathione S-transferase homolog; GSH-lyase GSH-dependent; 1.11A {Sphingobium SP} PDB: 4g10_A 4yav_A* 

Таким образом, мне нужно отсортировать строки и сопоставить строки на основе столбца 3 в ключевом файле и столбец 1 в файле для сортировки.

И полученный файл: (Дублирование колонн 3 & 4 было то, что я планировал разобраться после)

PVClumt18 PAK_2199 PAK_01997 PAK_01997 5ftj 5ftj_A 99.9 1.6e-26 4.2e-31 229.2 >5ftj_A Transitional endoplasmic reticulum ATPase; hydrolase, single-particle, AAA ATPase; HET: ADP OJA; 2.30A {Homo sapiens} PDB: 3cf1_A* 3cf3_A* 3cf2_A* 5ftk_A* 5ftl_A* 5ftm_A* 5ftn_A* 1r7r_A* 5c19_A 5c1b_A* 5c18_A* 3cf0_A* 
PVClopt2 PAK_2091 PAK_01895 PAK_01895 3j9q 3j9q_A 100.0 2.5e-35 6.4e-40 248.6 >3j9q_A Sheath; pyocin, bacteriocin, sheath, structural protein; 3.50A {Pseudomonas aeruginosa} 
PVCcif7 PAK_1975 PAK_01793 PAK_01793 5a3a 5a3a_A 50.8 6 0.00016 31.4 >5a3a_A SIR2 family protein; transferase, P-ribosyltransferase, metalloprotein, NAD-depen lipoylation, regulatory enzyme, rossmann fold; 1.54A {Streptococcus pyogenes} PDB: 5a3b_A* 5a3c_A* 
PVClopT12 PAU_02101 PAU_02063 PAU_02063 4yap 4yap_A 31.1 20 0.00052 29.1 >4yap_A Glutathione S-transferase homolog; GSH-lyase GSH-dependent; 1.11A {Sphingobium SP} PDB: 4g10_A 4yav_A* 
PVCpnf20 PAK_3524 PAK_03184 PAK_03184 1xju 1xju_A 99.4 4.1e-17 1.1e-21 98.8 >1xju_A Lysozyme; secreted inactive conformation, hydrolase; 1.07A {Enterobacteria phage P1} SCOP: d.2.1.3 
PVClopt3 PAK_2090 PAK_01894 PAK_01894 3j9q 3j9q_A 99.9 1.8e-29 4.6e-34 215.9 >3j9q_A Sheath; pyocin, bacteriocin, sheath, structural protein; 3.50A {Pseudomonas aeruginosa} 
PVClopT11 PAU_02102 PAU_02064 PAU_02064 1pqx 1pqx_A 37.4 13 0.00035 31.4 >1pqx_A Conserved hypothetical protein; ZR18,structure, autostructure,spins,autoassign, northeast structural genomics consortium; NMR {Staphylococcus aureus subsp} SCOP: d.267.1.1 PDB: 2ffm_A 2m6q_A 2m8w_A 
PVCunit2_11 plu1698 PLT_01726 PLT_01726 3h2t 3h2t_A 96.8 8e-06 2.1e-10 82.6 >3h2t_A Baseplate structural protein GP6; viral protein, virion; 3.20A {Enterobacteria phage T4} PDB: 3h3w_A 3h3y_A 
PVClumT9 afp10 PAU_02198 PAU_02198 4jiv 4jiv_D 69.6 1.6 4.2e-05 27.5 >4jiv_D VCA0105, putative uncharacterized protein; PAAR-repeat motif, membrane piercing, type VI secretion SYST vibrio cholerae VGRG2; HET: PLM STE ELA; 1.90A {Vibrio cholerae o1 biovar eltor} 
PVCunit2_17 plu1692 PLT_01720 PLT_01720 3ggm 3ggm_A 54.2 4.9 0.00013 26.2 >3ggm_A Uncharacterized protein BT9727_2919; bacillus cereus group., structural genomics, PSI-2, protein structure initiative; 2.00A {Bacillus thuringiensis serovarkonkukian} 
+0

Err. Вы запускаете 'keyfile' в качестве исполняемого файла и вставляете результат запуска его в качестве исполняемого файла в качестве первого столбца - это действительно * то, что вы хотите? –

+3

И ваше 'awk -v a =" $ field "на самом деле не содержит текст программы awk, переданный ему вообще. –

+0

btw, вы полностью * можете * использовать 'join' для этой цели - нет необходимости в' awk', чтобы удовлетворить случай использования вообще –

ответ

1

Когда вы передаете awk -v a="$field", спецификация переменной AWK a только хорошо для что одиночный awk команда. Вы не можете ожидать, что a будет доступен в совершенно другом вызове awk.

Таким образом, вы должны поместить его в месте непосредственно:

field=1 
awk -v a="$field" ' 
NR==FNR { 
    o[FNR]=$a; 
    next; 
} 

{ t[$1] = $0 } 

END { 
    for(x=1; x<=FNR; x++) { 
    y=o[x] 
    printf("%s\t%s\n", y, t[y]) 
    } 
}' "$keyfile" "$filetosort" 

Очки примечания:

  • Наша printf здесь излучающие как ключ и значение, поэтому нет необходимости использовать paste, чтобы поместить.значения обратно в
  • $a используется для лечения переменную AWK a (назначенный из переменной оболочки field), как и само имя переменной, а также для выполнения косвенных ссылок - таким образом, глядя вверх соответствующий номер столбца.
  • Всегда, всегда укажите ваши переменные оболочки при расширении.В противном случае у вас нет способа узнать, сколько аргументов для awk будет сгенерировано расширением $keyfile - оно может быть 0 (если в строке, не найденной в IFS, нет символов); он может быть 1, но он также может быть полностью неограниченным числом (input file.txt станет двумя аргументами: input и file.txt; * input * .txt будет заменен на каждый * на список файлов).
+0

А я вижу, это имеет смысл. Один из потоков, которые я читал (который я теперь не могу найти) показал их как отдельные команды оболочки, которые, как мне кажется, меня смутили. –

+0

Это awk-решение почти идеально, за исключением того, что мне нужно поддерживать целую строку из ключевого файла, поскольку она просто поддерживает строку, содержащую ключ сортировки. Я редактировал вопрос с входными файлами, поэтому, надеюсь, он более ясен. –

0

Я собираюсь добавить это как ответ, потому что он разрешает вопрос, как я его представлял, несмотря на отличный совет Чарльза о (бесчисленных) областях, в которых я ошибался.

Изменяя код выше с точкой Чарльза об отдельных командах AWK, теперь я могу вызвать следующее (извините, да, это все-таки с помощью paste) ...

#!/bin/bash 

keyfile="$1" 
filetosort="$2" 
indexfield="$3" 

paste "$keyfile" <(awk -v field="$indexfield" 'NR==FNR{o[FNR]=$field; next} {t[$1]=$0} END{for(x=1; x<=FNR; x++){y=o[x]; print t[y]}}' "$keyfile" "$filetosort") 

я пропускал $ перед тем, переменная, которую я вызывал в команде awk, которая является (частью), почему мой исходный код не работал, а также не включает объявление переменной awk в одном вызове awk.

Таким образом, bash sortandmatch.sh keyfile filetosort 3 производит выход, я хочу:

PVCunit2_5 plu1704   PLT_01732 PLT_01732 4etv 4etv_A 39.0 12 0.00032 27.6 >4etv_A Ryanodine receptor 2; phosphorylation, cardiac, metal transport; 1.65A {Mus musculus} 
PVCunit2_4 plu1705   PLT_01733 PLT_01733 3j9q 3j9q_A 99.9 7.2e-30 1.9e-34 219.0 >3j9q_A Sheath; pyocin, bacteriocin, sheath, structural protein; 3.50A {Pseudomonas aeruginosa} 
XVC_pnf15 XBW1_RS06910 XBW1_RS06910 XBW1_RS06910 1fi0 1fi0_A 69.2 1.7 4.4e-05 22.8 >1fi0_A VPR protein, R ORF protein; helix, viral protein; NMR {Synthetic} SCOP: j.11.1.1 
PVCcif7  PAU_01999  PAU_01967 PAU_01967 5a3a 5a3a_A 47.5 7.3 0.00019 30.9 >5a3a_A SIR2 family protein; transferase, P-ribosyltransferase, metalloprotein, NAD-depen lipoylation, regulatory enzyme, rossmann fold; 1.54A {Streptococcus pyogenes} PDB: 5a3b_A* 5a3c_A* 
PVClumT15 PAU_02233  PAU_02192 PAU_02192 1tdp 1tdp_A 22.1 37.0 0.00096 27.2 >1tdp_A Carnobacteriocin B2 immunity protein; four-helix bundle, antimicrobial protein; NMR {Carnobacterium maltaromaticum} SCOP: a.29.8.1 
XVC_pnf3 XBW1_RS06850 XBW1_RS06850 XBW1_RS06850 3eaa 3eaa_A 87.7 0.13 3.4e-06 35.7 >3eaa_A EVPC; T6SS, unknown function; 2.79A {Edwardsiella tarda} 
PVCunit1_4 afp4   PAU_02778 PAU_02778 3j9q 3j9q_A 99.9 3.6e-29 9.5e-34 214.6 >3j9q_A Sheath; pyocin, bacteriocin, sheath, structural protein; 3.50A {Pseudomonas aeruginosa} 
PVCunit2_3 plu1706   PLT_01734 PLT_01734 3j9q 3j9q_A 100.0 1.6e-34 4.3e-39 253.7 >3j9q_A Sheath; pyocin, bacteriocin, sheath, structural protein; 3.50A {Pseudomonas aeruginosa} 
PVClumt17 PAK_2200  PAK_01998 PAK_01998 3k8p 3k8p_C 34.7 16.0 0.00041 34.1 >3k8p_C DSL1, KLLA0C02695P; intracellular trafficking, DSL1 complex, multisubunit tethering complex, snare proteins; 2.60A {Kluyveromyces lactis} 
PVClopT12 PAU_02101  PAU_02063 PAU_02063 4yap 4yap_A 31.1 20 0.00052 29.1 >4yap_A Glutathione S-transferase homolog; GSH-lyase GSH-dependent; 1.11A {Sphingobium SP} PDB: 4g10_A 4yav_A* 
+0

Re: «не отсортировано» - порядок сортировки должен соответствовать. –

+0

Насколько я могу судить, их нужно заказывать одинаково. Что именно происходит в поиске? Должен ли я указывать флаг для его рассмотрения только определенного столбца или чего-то еще? –

+0

Да, вам нужно указать конкретный столбец, и этот столбец должен быть отсортирован по документу. –

Смежные вопросы