Я хочу напечатать 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
последнее обновление образца ввода и желаемого вывода не соответствует ... как строки № 1 и № 3 заканчиваются 3 полями вывода, а строка № 2 имеет 4 поля вывода (почему RPKM
в конце строки # 2)?
Пара доработок:
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
Код, кажется, выводит его в формате, разделенном пробелами. Как изменить его на формат с разделением табуляцией?
FS=OFS = "\t"
говорит определить разделители полей ввода и вывода (FS, OFS) как вкладки; если вы передаете вывод в od
(например, awk ... | od -c
), вы должны увидеть \t
между каждым столбцом; ПРИМЕЧАНИЕ. В моем первоначальном ответе была опечатка (была )
вместо }
) ... это было исправлено ... и нет, эта опечатка создала бы синтаксическую ошибку вместо замены \t
пробелами.
Первый столбец во входных данных не отображался как первый столбец в выходном файле. Строки начинаются с других столбцов, а не с столбца 1 ввода.
Мой сырой ввод можно получить с помощью 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__data.Level_3.2016012800.0.0.tar.gz
, если вам это нужно
Я добавил образец head -3 input.csv
.
вывод od -c
не соответствует ни вашим исходным данным, ни описанию, которое ссылается на gene
и raw_counts
; сказав это, вывод od -c
показывает, что столбцы разделены табуляцией, и если я изменю свой input.csv
так, чтобы первый столбец с разделителями табуляции был Hybridization REF
, то этот awk
ответ печатает Hybridization REF ...
в качестве вывода; в вашем полном выводе od -c
вы видите \r
в самом конце строки ввода?
дальнейшая отладка потребует, чтобы у нас была копия фактического файла или, по крайней мере, первые несколько строк; наиболее компактным подходом, вероятно, будет head -2 input.csv | base64
... мы могли бы, по крайней мере, обратить это (base64 -d
), чтобы создать точную копию файла
head -2 input.csv | base64
превышает предел вывода StackOverflow. head -2 input.csv | base64 -d
приводит к &�سjبbase64: неверный ввод
base64 -d
— это то, что мы будем запускать в наших системах, чтобы изменить вывод из base64
Вы можете сделать это:
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
Не просто показывайте заголовок, включите некоторые данные в свой образец ввода/вывода. Почему вы начинаете свой цикл с поля 3, когда первым полем raw_counts является поле 2? Почему вы также не печатаете 1 доллар, если хотите распечатать столбец генов?