#bash #awk #text #cut
#bash #awk #текст #вырезать
Вопрос:
Данные:
CHR SNP BP A1 TEST NMISS BETA SE L95 U95 STAT P
1 chr1:1243:A:T 1243 T ADD 16283 -6.124 0.543 -1.431 0.3534 -1.123 0.14
Желаемый результат:
MarkerName P-Value
chr1:1243 0.14
Фактический файл состоит из 1,2 Г строк, подобных приведенным выше
Мне нужно удалить 2-й столбец текста после 2-го двоеточия, а затем вставить это в последний 12-й столбец и присвоить ему новый заголовок.
Я пробовал:
awk '{print $2, $12}' | cut -d: -f1-2
но при этом удаляется вся строка после двоеточий, и я хочу сохранить столбец «p»
Я вывел это в новый файл, а затем вставил его в столбец P-value с помощью awk, но мне было интересно, существует ли однострочный метод для этого?
Большое спасибо
Комментарии:
1. Используйте
split($2,a,/:/)
иprintf "%s:%s %sn",a[1],a[2],$12
.2. Я реализовал свой комментарий ниже в качестве ответа.
Ответ №1:
Мой комментарий в более понятной форме:
$ awk '
BEGIN {
print "MarkerName P-Value" # output header
}
NR>1 { # skip the funky first record
split($2,a,/:/) # split by :
printf "%s:%s %sn",a[1],a[2],$12 # printf allows easier output formating
}' file
Вывод:
MarkerName P-Value
chr1:1243 0.14
Комментарии:
1. большое спасибо! Не знал, что крестный отец soul был поклонником awk!
Ответ №2:
РЕДАКТИРОВАТЬ: добавление здесь еще одного решения, поскольку OP упомянул, что мое первое решение почему-то не сработало для OP, но оно отлично работало для меня, в качестве альтернативы добавляя это здесь.
awk '
BEGIN{
print "MarkerName P-Value"
}
FNR>1{
match($2,/([^:]*:){2}/)
print OFS substr($2,RSTART,RLENGTH-1),$NF
}
' Input_file
С показанными примерами, не могли бы вы попробовать следующее. Вам не нужно использовать cut
with awk
, awk
он может позаботиться обо всем сам по себе.
awk -F' |:' '
BEGIN{
print "MarkerName P-Value"
}
FNR>1{
print OFS $2":"$3,$NF
}
' Input_file
Объяснение: добавление подробного объяснения выше.
awk -F' |:' ' ##Starting awk program from here and setting field separator as spaces or colon for all lines.
BEGIN{ ##Starting BEGIN section of this program from here.
print "MarkerName P-Value" ##Printing headers here.
}
FNR>1{ ##Checking condition if line number is greater than 1 then do following.
print OFS $2":"$3,$NF ##Printing space(OFS) 2nd field colon 3rd field and last field as per OP request.
}
' Input_file ##Mentioning Input_file name here.
Ответ №3:
$ awk -F'[: ] ' '{print (NR==1 ? "MarkerName P-Value" : $2":"$3" "$NF)}' file
MarkerName P-Value
chr1:1243 0.14
Ответ №4:
Альтернатива Sed:
sed -En '1{s/^.*$/MarkerNametP-Value/p};s/([[:digit:]] [[:space:]] )([[:alnum:]] :[[:digit:]] )(.*)([[:digit:]] .[[:digit:]] $)/2t4/p'
В первой строке замените заголовки на полную строку. Затем разделите строку на 4 раздела на основе регулярных выражений, а затем выведите 2-й подраздел, за которым следует вкладка, а затем 4-й подраздел.