Как извлечь конкретную информацию из нескольких файлов и составить таблицу в Linux?

У меня есть несколько текстовых файлов с информацией. Здесь я показываю два текстовых файла, как показано ниже:

Образец1.txt

Status  /documents/Sample1.sorted.bam
Assigned        50945040
Unassigned_Unmapped     947866
Unassigned_MappingQuality       0
Unassigned_Chimera      0
Unassigned_FragmentLength       0
Unassigned_Duplicate    0
Unassigned_MultiMapping 49013681
Unassigned_Secondary    0
Unassigned_Nonjunction  0
Unassigned_NoFeatures   21189312
Unassigned_Overlapping_Length   0
Unassigned_Ambiguity    4430011

Образец2.txt

Status  /documents/Sample2.sorted.bam
Assigned        36335614
Unassigned_Unmapped     870456
Unassigned_MappingQuality       0
Unassigned_Chimera      0
Unassigned_FragmentLength       0
Unassigned_Duplicate    0
Unassigned_MultiMapping 68688141
Unassigned_Secondary    0
Unassigned_Nonjunction  0
Unassigned_NoFeatures   23746485
Unassigned_Overlapping_Length   0
Unassigned_Ambiguity    3734593

Для одного текстового файла я использую grep:

grep "Assigned\|Unmapped\|MultiMapping\|NoFeatures\|Ambiguity" Sample1.txt > output.txt

Но я хочу, чтобы результат был таким, как показано ниже, где я могу использовать небольшой скрипт для всего текстового файла и создать таблицу:

                        Sample1       Sample2
Assigned                50945040      36335614
Unassigned_Unmapped     947866        870456
Unassigned_MultiMapping 49013681      68688141
Unassigned_NoFeatures   21189312      23746485
Unassigned_Ambiguity    4430011       3734593

person beginner    schedule 27.05.2018    source источник


Ответы (1)


$ cat tst.awk
$2 != 0 {
    printf "%s%s", (NR>1 ? $1 : "Name"), OFS
    for (i=2; i<=NF; i+=2) {
        gsub(/^.*\/|\..*$/,"",$i)
        printf "%s%s", $i, (i<NF ? OFS : ORS)
    }
}

$ paste Sample1.txt Sample2.txt | awk -f tst.awk | column -t
Name                     Sample1   Sample2
Assigned                 50945040  36335614
Unassigned_Unmapped      947866    870456
Unassigned_MultiMapping  49013681  68688141
Unassigned_NoFeatures    21189312  23746485
Unassigned_Ambiguity     4430011   3734593

Чтобы получить вывод, который Excel может понять, а не вывод, показанный в вопросе, сделайте следующее:

$ cat tst.awk
BEGIN { OFS="," }
$2 != 0 {
    printf "%s%s", (NR>1 ? $1 : "Name"), OFS
    for (i=2; i<=NF; i+=2) {
        gsub(/^.*\/|\..*$/,"",$i)
        printf "%s%s", $i, (i<NF ? OFS : ORS)
    }
}

$ paste Sample1.txt Sample2.txt | awk -f tst.awk > output.csv

а затем дважды щелкните файл output.csv, чтобы открыть его в Excel.

person Ed Morton    schedule 27.05.2018
comment
это сработало, но все столбцы присутствовали в одном столбце. Я хочу, чтобы они были в разных столбцах (первый столбец: имя, второй столбец: Sample1, третий столбец: Sample2, четвертый столбец: Sample3....и так далее... И не могли бы вы немного объяснить, что такое NF, NR ,ОФС,ОРС в коде.Спасибо - person beginner; 27.05.2018
comment
Как вы можете видеть в моем ответе, вывод составляет несколько столбцов, как вы и хотели, поэтому я не понимаю, что означает all the columns were present in a single column. Может быть, ваш входной файл содержит окончания строк DOS (control-M), из-за чего все столбцы будут перезаписывать друг друга? Запустите cat -v для входного файла, чтобы увидеть его, и, если он присутствует, сначала запустите dos2unix для файлов, чтобы удалить их, или добавьте {sub(/\r/,"")} в качестве первой строки сценария awk. Это основные встроенные переменные awk, поэтому просто найдите их на странице руководства. - person Ed Morton; 27.05.2018
comment
В файлах нет окончаний строк DOS. Я просто дал эту пасту *.txt.summary | awk -f tst.awk | column -t › output.txt Когда я открываю файл output.txt, я вижу все данные только в одном столбце (что означает, что данные не разделены на разные столбцы) - person beginner; 27.05.2018
comment
Вам придется немного постараться, чтобы объяснить возникшую у вас проблему. Как вы можете видеть в моем ответе, вывод явно состоит из 3 столбцов. Когда вы запускаете paste *.txt.summary | awk -f tst.awk | column -t, вы видите или не видите тот же результат, что и в моем ответе, на вашем экране? Когда вы говорите When I opened output.txt file..., что точно вы имеете в виду под открытым? Какой инструмент вы используете, чтобы открыть его? Требует ли этот инструмент использовать какой-либо конкретный символ (или строку) для разделения столбцов, чтобы он понимал, что такое столбец в ваших данных? - person Ed Morton; 27.05.2018
comment
Привет, Эд! Получив файл output.txt, я открыл его в Microsoft Excel. Все данные были видны в одном столбце. Затем я разделил их на разные столбцы, используя Text to columns в Excel. - person beginner; 28.05.2018
comment
Хорошо, теперь мы получаем кое-что. Проблема связана с указанным вами желаемым результатом в вашем вопросе. Мой инструмент выводит то, что вы просили, но это не тот формат, который может понять Excel. Чтобы Excel читал текстовый файл как отдельные столбцы, этот входной файл должен быть разделен определенными символами, например. ,, а не путем изменения последовательностей пустых символов, которые обеспечивают табличное выравнивание, как вы просили в своем вопросе, и поэтому я предоставил в своем ответе. Дайте мне одну секунду, и я добавлю версию, которая выводит текст, который Excel может читать как столбцы. - person Ed Morton; 28.05.2018
comment
Сделанный. Смотрите мой обновленный ответ. Я просто сделал вывод через запятую вместо таблицы. - person Ed Morton; 28.05.2018
comment
Да, большое спасибо. Как я уже просил, не могли бы вы немного объяснить код. Что такое NF, NR, OFS, ORS и другие символы в коде. - person beginner; 28.05.2018
comment
Пожалуйста. Как я уже ответил, это встроенные переменные awk, подробно описанные на странице руководства. Просто взгляните на это. - person Ed Morton; 28.05.2018