Переформатирование текстового файла с использованием awk и вырезать как однострочный

#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-й подраздел.