#awk
#awk
Вопрос:
Как можно извлечь каждую строку из приведенного ниже файла и добавить содержимое в файл, который назван в честь 3-го столбца (например, Backbone_3710)?
HWI-ST945_0069:2:1101:17889:2254#GNNNNN/11 16 Backbone_3710 13730 1 28M1D61M1D11M * 0 0 AATAGGGAAAAGCCGGCTATCGGAATCGAACCGATGACCATCGCATTACAAATGCGATGCTCTAACCTCTGAGCTAAGCGGGCCCACATAACAGAAATCT * NM:i:5 ms:i:144 AS:i:148 nn:i:0 tp:A:P cm:i:5 s1:i:40 s2:i:59 de:f:0.0490 rl:i:0
HWI-ST945_0069:2:1101:17753:2257#GNNNNN/11 16 Backbone_2546 1217877 23 23S62M1I14M * 0 0 ATTTGATTGTGCATATTAGTGTGTTTTTTCATTTGTGCATGCATGGCAAGTCATAAAAAATACAAAAGAACTACATAAGCATTTAGGGTTTAATTTCACA * NM:i:3 ms:i:118 AS:i:118 nn:i:0 tp:A:P cm:i:3 s1:i:51 s2:i:0 de:f:0.0390 rl:i:0
HWI-ST945_0069:2:1101:17922:2282#ANNNNN/11 16 Backbone_2065 955626 2 16S20M2I7M1D11M3I35M1D6M * 0 0 GAACGAGAAGAAGATTATTTCAACGTCGAGGCTTGGAAAAACTTTATTTAGGAGCTTCAAATTGATAGGGCAGTCCTACGAGTGGAATAAGAGGACATGT * NM:i:9 ms:i:78 AS:i:80 nn:i:0 tp:A:P cm:i:4 s1:i:27 s2:i:0 de:f:0.0723 rl:i:0
HWI-ST945_0069:2:1101:17799:2282#ANNNNN/11 16 Backbone_3859 11630 1 75M1I24M * 0 0 TCGTGTTCAACACAGTATTCATACGGGAAATTATGATCAAAGAGTTCTTTATCAACCGCCATCTACTTCAGAGATCCCTACGGAAATCTTTTTCAAATAC * NM:i:5 ms:i:144 AS:i:144 nn:i:0 tp:A:P cm:i:5 s1:i:47 s2:i:54 de:f:0.0500 rl:i:0
HWI-ST945_0069:2:1101:17876:2290#GNNNNN/11 0 Backbone_1630 114655 2 23S37M40S * 0 0 ACATGCATAAGGAATCTTTGGCCTAGTCTCAAAAGTCGGTCTAATTCAGAAGTACTAATTCAAGAGATAGAATATGAGGATGAACAAGAGTATGATAAGG * NM:i:1 ms:i:64 AS:i:64 nn:i:0 tp:A:P cm:i:3 s1:i:27 s2:i:0 de:f:0.0270 rl:i:0
HWI-ST945_0069:2:1101:17982:2293#GNNNNN/11 4 * 0 0 * * 0 0 TGATTAAAATAATTGCTCATAAATATAATAGAATTAAAGGAAAAAGGTAAAAGAAAGCATTGAAGAAAAGAAAGAAAGAGCCAAGTTTTATATGCAGTAG * rl:i:0
HWI-ST945_0069:2:1101:17833:2296#GNNNNN/11 4 * 0 0 * * 0 0 TGAGGGTTCCAGATTAAATGCCAATTCAAACTTCCTACTGGGAATCATTGTTCAGGCGAGTTCTGACAACTCTTAGTGGAGAAGGCATTGGTGCCTACCC * rl:i:0
HWI-ST945_0069:2:1101:17908:2302#GNNNNN/11 4 * 0 0 * * 0 0 TAATTTAAATAGTGCATTGGACTTTCAGATTTGGTTCAATATTCAACATGGGTCGACTTCTTATGGATGATTTTAGAAGTGGGTTTGAGGAAGGACCTTG * rl:i:0
HWI-ST945_0069:2:1101:17759:2305#ANNNNN/11 16 Backbone_870 367318 10 27M1I34M3D6M1I31M * 0 0 ACATAGGGCCTCCATTCCCTAGTCGCCTTTTTGGAACATTAGGGCTCCAATCCCAGAGTTGAGTTTAATAGATAGGGCCTCCATTCCCTAGTCGCCTTTT * NM:i:13 ms:i:78 AS:i:78 nn:i:0 tp:A:P cm:i:3 s1:i:43 s2:i:42 de:f:0.1089 rl:i:0
HWI-ST945_0069:2:1101:17878:2318#GNNNNN/11 0 Backbone_2304 815440 1 67M1D27M6S * 0 0 TGGGTTCTTTTATTAAAGACCCTATATGCTTTACTACGTGAGGAATATCCAATGAAAATACCTTCATCCGACTTAGCATCAAATTTACCCAATTAGTCTT * NM:i:3 ms:i:160 AS:i:160 nn:i:0 tp:A:P cm:i:7 s1:i:60 s2:i:71 de:f:0.0316 rl:i:0
Заранее благодарю вас.
Комментарии:
1. Вам нужен файл с именем
*
?2. Хороший момент. Если это звезда, то игнорировать строку.
3. @user977828: Опубликуйте усилия, которые вы предприняли самостоятельно, чтобы решить эту проблему
4. @Inian, вы изменили тег с bash на awk, но я не вижу ни одного из этих языков в вопросе. Что я пропустил?
5. @ghoti: Он был помечен ими обоими из OP. Я не видел никакого отношения к наличию
bash
тега в этом. Итак, удалили только это!
Ответ №1:
Что-то вроде
awk '$3 != "*" { print $0 >> $3; close($3) }' input.txt
должно сработать. Обратите внимание на использование close()
после каждой печати, чтобы избежать нехватки файловых дескрипторов, если на выходе будет куча разных файлов.
Комментарии:
1. Это было бы хорошо, если бы не было повторяющихся
$3
записей. Если они присутствуют, это будет означать открытие и закрытие дескрипторов файла для каждой повторяющейся записи. Идеальным способом было бы сохранить их и закрыть все в конце, что-то вродеawk ' $3 !~ "*" { fh[$3]; print $0 >> $3 } END { for (handle in fh) close(handle) } ' file
2. @Inian в этом
END
блоке нет смысла, потому что все открытые файлы в любом случае закрываются при выходе. Если в данные OP будет записано всего до нескольких десятков разных файлов, то, скорее всего, будет нормально исключитьclose()
. Сотни или тысячи? Тогда у вас проблемы с ограничением на открытые файлы, и вам нужен способ их обрезать. Это простой способ.3. Это может быть от 2000 до 10000 файлов.