Как выровнять 3 файла на основе значения первого столбца - PullRequest
5 голосов
/ 09 декабря 2010

У меня есть 3 текстовых файла c.dat, n.dat и h.dat Содержимое аналогично, в этом формате

c.dat    n.dat    h.dat
1 0.ccc  3 1.nnn  1 2.hhh
2 0.ccc  4 1.nnn  2 2.hhh
4 0.ccc  5 1.nnn  5 2.hhh

Желаемый вывод:

1 0.ccc Inf 2.hhh
2 0.ccc Inf 2.hhh
3 Inf 1.nnn Inf
4 0.ccc 1.nnn Inf
5 Inf 1.nnn 2.hhh
6 Inf Inf Inf
7 ....

КаждыйВ файле ~ 100 строк, но они не всегда начинаются с 1 и не всегда являются последовательными.

Мне нужно выровнять 3 файла по первому столбцу, так что если другие файлыего нет, оно заполнено чем-то вроде NA, или NaN, или Inf ... что угодно.

Спасибо!

Ответы [ 4 ]

4 голосов
/ 09 декабря 2010
awk '
{
        if(FNR==1){f++}
        a[$1,f] = $2
        if($1 > max){max = $1}
}

END{
        for(j=1;j<=max;j++){
          printf("%d\t", j)
          for(i=1;i<=f;i++){
            if(!a[j,i]){printf("Inf\t")}
            else{printf("%s\t", a[j,i])}
          }
          printf("\n")
        }
}' ./c.dat ./n.dat ./h.dat

Выход

$ ./awk.dat
1       0.ccc   Inf     2.hhh
2       0.ccc   Inf     2.hhh
3       Inf     1.nnn   Inf
4       0.ccc   1.nnn   Inf
5       Inf     1.nnn   2.hhh
0 голосов
/ 09 декабря 2010

Чистый Баш.

maxindex=0

while read idx val ; do                         # build array from c.dat
    c[idx]=$val
    [ $maxindex -lt $idx  ] && maxindex=$idx
done < 'c.dat'

while read idx val ; do                         # build array from n.dat
    n[idx]=$val
    [ $maxindex -lt $idx  ] && maxindex=$idx
done < 'n.dat'

while read idx val ; do                         # build array from h.dat
    h[idx]=$val
    [ $maxindex -lt $idx  ] && maxindex=$idx
done < 'h.dat'

for (( idx=1; idx<=$maxindex; idx+=1 )); do
    echo -e "$idx  ${c[idx]:-INF} ${n[idx]:-INF} ${h[idx]:-INF}"
done
0 голосов
/ 09 декабря 2010

man paste должен дать вам ответ - paste -d ' ' file1 file2 file3

0 голосов
/ 09 декабря 2010

Вид грязного решения - я создал Perl-скрипт для цикла от 1 до 100, предварительно сформировав операторы 3 grep, конвейер до awk и, если он вернется пустым, выведите Inf.

Все еще ищу более элегантное решение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...