Распечатайте первый и каждый n-й столбец, используя awk

Я хочу напечатать 1-й столбец (gene) и все столбцы raw_counts в файле, разделенном табуляцией.

Я пробовал:

BEGIN {FS = "\t"}
{for (i = 3; i <= NF; i += 1) printf ("%s%c", $i, i + 1 <= NF ? "\t" : "\n");}

но выход такой же, как и вход.

awk -f prog.awk < input.csv > output.csv

Входные данные:

head -3 input.txt

Hybridization REF       TCGA-A3-3306-01A-01R-0864-07    TCGA-A3-3306-01A-01R-0864-07    TCGA-A3-3306-01A-01R-0864-07   TCGA-A3-3307-01A-01R-0864-07     TCGA-A3-3307-01A-01R-0864-07    TCGA-A3-3307-01A-01R-0864-07
gene    raw_counts      median_length_normalized        RPKM    raw_counts      median_length_normalized        RPKM  
?|100130426     1       0.122549019607843       0.0330807728010661      0       0       0       

Желаемый результат:

Hybridization REF       TCGA-A3-3306-01A-01R-0864-07      TCGA-A3-3307-01A-01R-0864-07       
gene    raw_counts    raw_counts       RPKM   
?|100130426     1       0   

Не просто показывайте заголовок, включите некоторые данные в свой образец ввода/вывода. Почему вы начинаете свой цикл с поля 3, когда первым полем raw_counts является поле 2? Почему вы также не печатаете 1 доллар, если хотите распечатать столбец генов?

Ed Morton 03.02.2023 17:40

последнее обновление образца ввода и желаемого вывода не соответствует ... как строки № 1 и № 3 заканчиваются 3 полями вывода, а строка № 2 имеет 4 поля вывода (почему RPKM в конце строки # 2)?

markp-fuso 03.02.2023 19:29
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
2
86
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Пара доработок:

  • начать счетчик цикла в 2
  • увеличивайте счетчик циклов на +3 при каждом проходе

Изменение кода OP:

$ awk 'BEGIN {FS=OFS = "\t"} {printf "%s",$1; for (i=2;i<=NF;i+=3) printf "%s%s",OFS,$i; print ""}' input.csv    
gene    raw_counts      raw_counts      raw_counts      raw_counts      raw_counts

После нескольких изменений в образце входных данных и ожидаемых выходных данных последние:

$ cat input.csv
Hybridization REF       TCGA-A3-3306-01A-01R-0864-07    TCGA-A3-3306-01A-01R-0864-07    TCGA-A3-3306-01A-01R-0864-07    TCGA-A3-3307-01A-01R-0864-07    TCGA-A3-3307-01A-01R-0864-07      TCGA-A3-3307-01A-01R-0864-07
gene    raw_counts      median_length_normalized        RPKM    raw_counts      median_length_normalized        RPKM
?|100130426     1       0.122549019607843       0.0330807728010661      0       0       0

Вышеприведенный awk генерирует:

Hybridization REF       TCGA-A3-3306-01A-01R-0864-07    TCGA-A3-3307-01A-01R-0864-07
gene    raw_counts      raw_counts
?|100130426     1       0

Код, кажется, выводит его в формате, разделенном пробелами. Как изменить его на формат с разделением табуляцией?

melolilili 03.02.2023 18:27

FS=OFS = "\t" говорит определить разделители полей ввода и вывода (FS, OFS) как вкладки; если вы передаете вывод в od (например, awk ... | od -c), вы должны увидеть \t между каждым столбцом; ПРИМЕЧАНИЕ. В моем первоначальном ответе была опечатка (была ) вместо }) ... это было исправлено ... и нет, эта опечатка создала бы синтаксическую ошибку вместо замены \t пробелами.

markp-fuso 03.02.2023 18:33

Первый столбец во входных данных не отображался как первый столбец в выходном файле. Строки начинаются с других столбцов, а не с столбца 1 ввода.

melolilili 03.02.2023 18:51

Мой сырой ввод можно получить с помощью wget http://gdac.broadinstitute.org/runs/stddata__2016_01_28/data‌​/KIPAN/20160128/gdac‌​.broadinstitute.org_‌​KIPAN.Merge_rnaseq__‌​illuminahiseq_rnaseq‌​__unc_edu__Level_3__‌​gene_expression__dat‌​a.Level_3.2016012800‌​.0.0.tar.gz, если вам это нужно

melolilili 03.02.2023 18:53

Я добавил образец head -3 input.csv.

melolilili 03.02.2023 19:14

вывод od -c не соответствует ни вашим исходным данным, ни описанию, которое ссылается на gene и raw_counts; сказав это, вывод od -c показывает, что столбцы разделены табуляцией, и если я изменю свой input.csv так, чтобы первый столбец с разделителями табуляции был Hybridization REF, то этот awk ответ печатает Hybridization REF ... в качестве вывода; в вашем полном выводе od -c вы видите \r в самом конце строки ввода?

markp-fuso 03.02.2023 19:14

дальнейшая отладка потребует, чтобы у нас была копия фактического файла или, по крайней мере, первые несколько строк; наиболее компактным подходом, вероятно, будет head -2 input.csv | base64 ... мы могли бы, по крайней мере, обратить это (base64 -d), чтобы создать точную копию файла

markp-fuso 03.02.2023 19:16
head -2 input.csv | base64 превышает предел вывода StackOverflow. head -2 input.csv | base64 -d приводит к &�سjبbase64: неверный ввод
melolilili 03.02.2023 19:23

base64 -d — это то, что мы будем запускать в наших системах, чтобы изменить вывод из base64

markp-fuso 03.02.2023 19:24

Вы можете сделать это:

awk 'BEGIN{FS=OFS = "\t"}
FNR==1{
    header[1]
    for(i=2;i<=NF;i++) if ($i= = "raw_counts") header[i]
}
{
    for (i=1;i<=NF;i++) 
        if (i in header) {printf("%s%s", sep, $i); sep=OFS}
    print ""
}' file 

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

ОБНОВЛЕНИЕ 1: все работает от начала до конца (знак http необходим):

--- Я использовал bsd-tar вместо gnu-tar

 curl -s -L -f -g '

   https://gdac.broadinstitute.org/runs/stddata__2016_01_28/
                                       data/KIPAN/20160128/
           gdac.broadinstitute.org_KIPAN.
            Merge_rnaseq__illuminahiseq_rnaseq__unc_edu__Level_3
             __gene_expression__data.Level_3.2016012800.0.0.tar.gz' | 

 tar -xvO -f- |

 mawk '{ print $1 '"$( jot -s '' -w ',$%d' - 2 14 3 )"' }' OFS='\t' | 

 gcat -n
 1  8c6f0954749188f5266253fd418d6d9f    KIPAN.rnaseq__illuminahiseq_rnaseq__unc_edu__Level_3__gene_expression__data.data.txt                
 2  Hybridization   REF TCGA-A3-3306-01A-01R-0864-07    TCGA-A3-3307-01A-01R-0864-07    TCGA-A3-3308-01A-02R-1325-07    TCGA-A3-3311-01A-02R-1325-07
 3  gene    raw_counts  raw_counts  raw_counts  raw_counts  raw_counts
 4  ?|100130426 1   0   0   3   0
 5  ?|100133144 70  47  159 168 236

 6  ?|100134869 46  19  50  71  138
 7  ?|10357 135 138 245 325 266
 8  ?|10431 1715    1625    2743    3801    5171
 9  ?|136542    0   0   0   0   0
10  ?|155060    464 476 1874    771 740
  .
  .
 20531  ZYX|7791    4944    8779    19825   19639   12883
 20532  ZZEF1|23140 3233    3306    8731    9156    17034
 20533  ZZZ3|26009  3061    2405    4269    5967    6594
 20534  psiTPTE22|387590    379 377 675 669 1385
 20535  tAKR|389932 5   5   31  27  36

Не тратьте время на зацикливание столбцов — используйте seq или jot для динамической генерации статического awk кода на лету:

  gawk -be '{ print $1 '"$( jot -s '' -w ',$%d' - 2 14 3 )"' }'

  # gawk profile, created Fri Feb  3 13:08:10 2023

  # Rule(s)

 1  {
 1      print $1, $2, $5, $8, $11, $14
     }


gene raw_counts raw_counts raw_counts raw_counts raw_counts

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