Извлечение файловых столбцов на основе функции заголовка - PullRequest
0 голосов
/ 05 октября 2018

У меня большой матричный файл csv (input.csv) в следующем формате:

Patient,sample 66_pos_LC/MS Pos_con,sample 57_net_LC/MS Neg_dis,sample 1_LC/MS Polar_con,sample 3_LC/MS Neg_net
xx,2.5,-7.8,2.5,3.6
ab 1,5.4,3,0.3
yy,43,33,77,55

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

output1.csv

Patient,sample 57_net_LC/MS Neg_dis,sample 3_LC/MS Neg_net
xx,-7.8,3.6
ab,5.4,0.3
yy,33,55

Для этого я использую:

head -n 1 input.csv | tr ',' '\n' | cat -n | grep 'LC/MS Neg'

Это дает номера столбцов, где я должен смотреть (в данном случае: 3 и 5);чтобы получить приведенный выше вывод, я использую:

cut -d, -f1,3,5 input.csv > output1.csv

Хотя это дает мне желаемый вывод, но я считаю, что это будет сложно для извлечения многих столбцов за раз.

Я буду оченьспасибо за решение awk / sed.

Спасибо.

Ответы [ 2 ]

0 голосов
/ 05 октября 2018
$ cat tst.awk
BEGIN { FS=OFS="," }
NR==1 {
    f[++numFlds] = 1
    for (i=2; i<=NF; i++) {
        if ($i ~ sel) {
            f[++numFlds] = i
        }
    }
}
{
    for (i=1; i<=numFlds; i++) {
        printf "%s%s", $(f[i]), (i<numFlds ? OFS : ORS)
    }
}

.

$ awk -v sel=Neg -f tst.awk file
Patient,sample 57_net_LC/MS Neg_dis,sample 3_LC/MS Neg_net
xx,-7.8,3.6
ab 1,3,
yy,33,55

$ awk -v sel=Pos -f tst.awk file
Patient,sample 66_pos_LC/MS Pos_con
xx,2.5
ab 1,5.4
yy,43

$ awk -v sel=Polar -f tst.awk file
Patient,sample 1_LC/MS Polar_con
xx,2.5
ab 1,0.3
yy,77

$ awk -v sel='Pos|Neg' -f tst.awk file
Patient,sample 66_pos_LC/MS Pos_con,sample 57_net_LC/MS Neg_dis,sample 3_LC/MS Neg_net
xx,2.5,-7.8,3.6
ab 1,5.4,3,
yy,43,33,55
0 голосов
/ 05 октября 2018
$ cat get_cols.awk
BEGIN{ FS=OFS="," }
NR==1 {
    i = 1
    idx[i++] = 1
    for(j=2; j<=NF; j++)
        if($j ~ /LC\/MS Neg/)
            idx[i++] = j
}
{
    for(k=1; k<i; k++)
        printf "%s", k==1 ? $idx[k] : OFS $idx[k]
    print ""
}
  • установить разделитель поля ввода и вывода как ,
  • использовать массив idx для сохранения индекса, который нам нужно напечатать
    • первый столбец всегда необходим
    • чтобы получить остаток, переберите поля заголовка и посмотрите, какие из них соответствуют критериям
  • , затем напечатайте поля

Запустите его как:

$ awk -f get_cols.awk ip.txt 
Patient,sample 57_net_LC/MS Neg_dis,sample 3_LC/MS Neg_net
xx,-7.8,3.6
ab,5.4,0.3
yy,33,55


Та же концепция, что и perl

$ perl -F, -lane '@idx = grep { $F[$_] =~ m|LC/MS Neg| } (1..$#F) if $.==1;
                  print join ",", @F[0,@idx]' ip.txt
Patient,sample 57_net_LC/MS Neg_dis,sample 3_LC/MS Neg_net
xx,-7.8,3.6
ab,5.4,0.3
yy,33,55
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...