В PowerShell:
(([System.DateTimeOffset]::FromUnixTimeMilliSeconds($unixtime)).DateTime).ToString("s")
Предполагая, что первый столбец вашего<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.800
→ 237.8
и 0.000
→ 0
.
В качестве альтернативы, расширяя sub
подход, основанный на замене -, показанный в вашем вопросе, в соответствии с вышеупомянутыми предположениями, но с требованием ровно девяти, возможно, пустых, вертикальных черт -, разделенных элементы в первом поле — сценарий AWK может стать (при прочих равных условиях):
NR > 1 { gsub(/^([^|]*\|){4,4}|(\|[^|]*){4,4}$/,"",$1); } 1
gsub
используется вместо sub
, потому что мы хотим удалить две совпадающие подстроки :первые четыре|
-разделенных элемента (обратите внимание на якорь ^
)и последние четыре (обратите внимание на якорь $
).
Мир - твоя устрица..
С 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