смешивание текстовых файлов со всеми полями в awk - PullRequest
0 голосов
/ 06 февраля 2019

У меня есть 2 разделенных табуляцией файла, как эти маленькие примеры:

example1:

RBM3    1517    993 -0.611355
RBM4    142 142 0
PRKAG1  146 73  -1
MORF4L2 1766    715 -1.30447

example2:

PCNP    370 139 -1.41244
RBM3    60  60  0
COTL1   338 252 -0.4236
PRKAG1  276 225 -0.294743

Я хочу получить общие строки на основев столбце 1 (в обоих файлах) и создайте новый файл с 7 столбцами, в котором 1-й столбец является 1-м столбцом в исходных файлах, а столбцы 2, 3 и 4 взяты из 1-го файла, а столбцы 5, 6 и 7 - из2-й файл (столбцы 2, 3 и 4).Вот ожидаемый результат:

Ожидаемый результат:

RBM3    1517    993 -0.611355   60  60  0
PRKAG1  146 73  -1  276 225 -0.294743

Я пытаюсь сделать это в AWK, используя следующий код:

awk -v OFS="\t" 'NR==FNR {n[$2]=$1;next} ($2 in n) {print $1, $2, $3, $4, n[$2], n[$3], n[$4]}' file1 file2  > results.txt

, но результатнеправильно.у тебя есть идеи как это исправить?

Ответы [ 3 ]

0 голосов
/ 06 февраля 2019

Еще раз, присоединиться лучше, чем awk для этого:

$ join -j1 <(sort -k1 file1.txt) <(sort -k1 file2.txt) | sed 's/ /\t/g'      
PRKAG1  146 73  -1  276 225 -0.294743
RBM3    1517    993 -0.611355   60  60  0

См. мой ответ в вашем другом посте, почему файлы сортируются;если вы используете мое решение для создания этих входных файлов, они уже будут отсортированы, и вы можете просто использовать файлы напрямую.На этот раз он использует sed, чтобы убедиться, что в выводе есть разделенные табуляцией столбцы.


Как указано в комментарии, некоторые оболочки (bash, zsh и другие) позволяют использовать $'\t' для получениясимвол табуляции.На них вы можете использовать join -t $'\t' -j1 sortedfile1.txt sortedfile2.txt и не использовать бит sed.Другие, такие как dash, не имеют, поэтому первая версия более переносима.

0 голосов
/ 06 февраля 2019

sort + awk

sort elly1.txt elly2.txt | awk ' {c=$1; if(c==p) {$1=""; print c,a,$0 } p=c;$1="";a=$0 } ' | sed 's/ +/\t/g'

с заданными входами

$ cat elly1.txt
RBM3    1517    993 -0.611355
RBM4    142 142 0
PRKAG1  146 73  -1
MORF4L2 1766    715 -1.30447

$ cat elly2.txt
PCNP    370 139 -1.41244
RBM3    60  60  0
COTL1   338 252 -0.4236
PRKAG1  276 225 -0.294743

$ sort elly1.txt elly2.txt | awk ' {c=$1; if(c==p) {$1=""; print c,a,$0 } p=c;$1="";a=$0 } ' | sed 's/ +/\t/g'
PRKAG1  146 73 -1  276 225 -0.294743
RBM3  1517 993 -0.611355  60 60 0

$
0 голосов
/ 06 февраля 2019

Вот один из способов:

$ awk -v OFS="\t" '
NR==FNR {              # file2
    k=$1               # set key
    $1=""              # nullify $1, OFS stays
    a[k]=$0            # hash record on k
    next
}
($1 in a) {            # file1, if $1 matches in a
    print $0 a[$1]     # output record and a
}' file2 file1         # mind the order
RBM3    1517    993     -0.611355       60      60      0
PRKAG1  146     73      -1      276     225     -0.294743

Использование вашего подхода будет что-то вроде (не проверено):

$ awk -v OFS="\t" '
NR==FNR {
    n[$1]=$2; o[$1]=$3; p[$1]=$4
    next
} 
($1 in n) {
    print $1, $2, $3, $4, n[$1], o[$1], p[$1]
}' file2 file1  > results.txt
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...