Вырежьте заданные c столбцы и сверните с разделителем в Unix - PullRequest
1 голос
/ 25 апреля 2020

Допустим, у меня есть 6 разных столбцов в текстовом файле (как показано ниже) ,

Таким образом, результат будет:

A1_B1_D1    C1  
1_G_GG      PP
z_T_GG      CC

Я пытался

cut -f 1,2,4 -d$'\t' 3, но это не то, что я хочу.

Ответы [ 5 ]

4 голосов
/ 25 апреля 2020

Если вам нужно сохранить выравнивание столбцов, вы можете проверить длину комбинации полей 1, 2 и 4 и добавить один или два tab символа, если необходимо,

awk '{
    printf (length($1"_"$2"_"$4) >= 8) ? "%s_%s_%s\t%s\n" : "%s_%s_%s\t\t%s\n",
            $1,$2,$4,$3
}' file

Пример вывода

A1_B1_D1        C1
1_G_GG          PP
z_T_GG          CC
2 голосов
/ 25 апреля 2020

Не могли бы вы попробовать следующее.

awk '
BEGIN{
  OFS="\t"
}
{
  print $1"_"$2"_"$4,$3
}
' Input_file
1 голос
/ 25 апреля 2020

Я пробовал код RavinderSingh13, и он имеет тот же вывод, что и мой, но я не совсем понимаю разницу, в любом случае, вот она:

awk -F ' ' '{print $1"_"$2"_"$4"\t"$3}' /path/to/file

0 голосов
/ 26 апреля 2020

Еще один awk и использование столбца -t для форматирования.

$ cat cols_345.txt
A1  B1  C1  D1  E1  F1
1   G   PP  GG  HH  GG
z   T   CC  GG  FF  JJ
$ awk -v OFS="_" '{ $3="\t"$3; print $1,$2,$4 $3 } ' cols_345.txt | column -t
A1_B1_D1  C1
1_G_GG    PP
z_T_GG    CC
$
0 голосов
/ 26 апреля 2020

Это может работать для вас (GNU sed):

sed 's/^(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+.*/\1_\2_\4\t\3/' -E file

Использовать сопоставление с образцом и обратные ссылки.

\S+ означает один или несколько непробельных символов пробела.

\s+ означает один или несколько символов пробела.

\t представляет вкладку.

...