Список элементов awk - PullRequest
       10

Список элементов awk

1 голос
/ 07 декабря 2011

У меня есть такой список:

s1   d2
s1   d4
s3   d2
s4   d1
s1   d3 
s4   d1
s5   d6
s3   d5
s1   d2
s1   d3

Мне нужно получить для каждого элемента в первом столбце (s_) список элементов во втором столбце (d_) втот же порядок появления.В этом случае:

s1  d2 d4 d3 d2 d3
s3  d2 d5
s4  d1 d1    
s5  d6 

Порядок s_ не важен, порядок d_ есть.Можете ли вы предложить простой и быстрый подход к этому (потому что список большой), может быть, в awk?

Ответы [ 4 ]

5 голосов
/ 07 декабря 2011

Возможно, что-то вроде этого (для командной строки):

awk '{ vals[$1] = vals[$1] " " $2 }; END { for (key in vals) { print key,vals[key] }}' list

Отформатирован как скрипт awk:

{ vals[$1] = vals[$1] " " $2 }
END {
    for (key in vals) {
        print key,vals[key]
    }
}

Для этого по индексу первых значений сохраняется строка, содержащая прогрессивные значения справа. Поэтому каждый раз, когда он находит его, он соединяет его до конца этой строки. Затем в конце он печатает каждую пару.

2 голосов
/ 07 декабря 2011

Я бы использовал ассоциативный массив для запоминания "sX", а затем выполнил бы конкатенацию строк со значением.

BEGIN {
print "ID\tList\n";
}
{
id[$1]=id[$1] $2;
}
END{
for (var in id)
    print var,"\t",id[var];
}
1 голос
/ 08 декабря 2011

Это гарантирует порядок ключей и значений:

awk 'END {
  for (i = 0; ++i <= c;)
    print idx[i], s[idx[i]]
  }
{
  s[$1] = s[$1] ? s[$1] OFS $2 : $2
  t[$1]++ || idx[++c] = $1
  }' infile
1 голос
/ 07 декабря 2011

Вот, пожалуйста:

 awk '{ ss[$1]++ ; ds[$1 NR]=$2 } 
      END { for ( e in ss ) 
                { a=e 
                  for (i=1;i<=NR;i++) 
                      { a=a " " ds[e i] }  
                  printf("%s\n",gensub("  +"," ","g",a))
                }
      }' INPUTFILE

НТН

...