разделитель файлов не работает с кодом awk

В PowerShell:

(([System.DateTimeOffset]::FromUnixTimeMilliSeconds($unixtime)).DateTime).ToString("s")

-1
25.06.2020, 16:54
2 ответа

Предполагая, что первый столбец вашего<TAB>-разделенного файла всегда содержит 9 элементов (на самом деле достаточно «по крайней мере 5 элементов» ), разделенных вертикальными чертами(|)(девятый элемент всегда пуст в образец, который вы предоставили ), и что ваша цель состоит в том, чтобы выбрать из него только пятый элемент, вы можете использовать удобную функцию AWK split:

awk -v FS='\t' -v OFS='\t' \
  'NR > 1 { split($1, t, /\|/); $1 = t[5]; } 1' input_file |
  column -t -R 2,3,4,5

columnиз пакета util -linux затем используется для форматирования вывода в виде таблицы(-t)со списком выровненных по правому краю -столбцов, заданных для опции -Rв качестве список, разделенный запятой -.

При необходимости вы можете принудительно преобразовать соответствующие поля в числа, чтобы они более точно соответствовали выходным данным, показанным в вашем вопросе. Например. с $5 = $5 + 0вы получаете 237.800237.8и 0.0000.

В качестве альтернативы, расширяя subподход, основанный на замене -, показанный в вашем вопросе, в соответствии с вышеупомянутыми предположениями, но с требованием ровно девяти, возможно, пустых, вертикальных черт -, разделенных элементы в первом поле — сценарий AWK может стать (при прочих равных условиях):

NR > 1 { gsub(/^([^|]*\|){4,4}|(\|[^|]*){4,4}$/,"",$1); } 1

gsubиспользуется вместо sub, потому что мы хотим удалить две совпадающие подстроки :первые четыре|-разделенных элемента (обратите внимание на якорь ^)и последние четыре (обратите внимание на якорь $).

4
28.04.2021, 23:12

Мир - твоя устрица..

С awk, если вы разделите на |, тогда все ваши данные будут в последнем поле, а ваш Nameбудет в $(NF-4), так что вы можете просто.....

awk -F'|' 'NR==1{print }NR>1{print $(NF-4) $NF}' file | column -t -R 2,3,4,5

Name             Length  EffectiveLength       TPM  NumReads
DDX11L1-202        1657         1493.961  0.112690     3.673
DDX11L1-201         632          468.996  0.000000     0.000
WASH7P-201         1351         1187.961  9.176212   237.800
MIR6859-1-201        68           69.000  0.000000     0.000
MIR1302-2HG-202     712          548.982  0.000000     0.000
MIR1302-2HG-201     535          372.012  0.000000     0.000

Затем вы можетеsplit$NFна \tполучить свое 0форматирование

awk -F'|' '
   NR==1{print }
   NR>1{split($(NF),vs,"\\t"); print $(NF-4), vs[2]+0, vs[3]+0, vs[4]+0, vs[5]+0}' file | 
   column -t -R 2,3,4,5

Name             Length  EffectiveLength      TPM  NumReads
DDX11L1-202        1657          1493.96  0.11269     3.673
DDX11L1-201         632          468.996        0         0
WASH7P-201         1351          1187.96  9.17621     237.8
MIR6859-1-201        68               69        0         0
MIR1302-2HG-202     712          548.982        0         0
MIR1302-2HG-201     535          372.012        0         0

Или, если у вас есть g awk, вы также можете использовать несколько разделителей [|\t]...

awk -F'[|\t]' '
   NR==1{print }
   NR>1{print $(NF-8), $(NF-3)+0, $(NF-2)+0, $(NF-1)+0, $NF+0}' file | 
   column -t -R 2,3,4,5

Name             Length  EffectiveLength      TPM  NumReads
DDX11L1-202        1657          1493.96  0.11269     3.673
DDX11L1-201         632          468.996        0         0
WASH7P-201         1351          1187.96  9.17621     237.8
MIR6859-1-201        68               69        0         0
MIR1302-2HG-202     712          548.982        0         0
MIR1302-2HG-201     535          372.012        0         0

Или вы могли бы вообще awkне участвовать в этом и

cut -d '|' --output-delimiter=" " -f 5,9 file | column -t -R 2,3,4,5

Name             Length  EffectiveLength       TPM  NumReads
DDX11L1-202        1657         1493.961  0.112690     3.673
DDX11L1-201         632          468.996  0.000000     0.000
WASH7P-201         1351         1187.961  9.176212   237.800
MIR6859-1-201        68           69.000  0.000000     0.000
MIR1302-2HG-202     712          548.982  0.000000     0.000
MIR1302-2HG-201     535          372.012  0.000000     0.000
1
28.04.2021, 23:12

Теги

Похожие вопросы