2013-09-22 3 views
2

Мне нужно, чтобы изменить порядок столбцов этого (разделенные табуляцией) данных:переупорядочения колонны с AWK

1 cat plays 
    1 dog eats 
    1 horse runs 
    1 red dog 
    1 the cat 
    1 the cat 

так что печатает как:

cat plays 1 
dog eats 1 
horse runs 1 
red dog 1 
the cat 2 

я попробовал:

sort [input] | uniq -c | awk '{print $2 "\t" $3 "\t" $1}' > [output] 

и результат:

1 cat 1 
1 dog 1 
1 horse 1 
1 red 1 
2 the 1 

Может ли кто-нибудь дать мне некоторое представление о том, что происходит не так? Спасибо.

+1

Другие ответили на ваш вопрос. В качестве стиля я бы написал 'awk -v OFS = '\ t' '{print $ 3, $ 4, $ 1}'' –

ответ

4

Поскольку выход cat input | sort | uniq -c является:

1 1 cat plays 
    1 1 dog eats 
    1 1 horse runs 
    1 1 red dog 
    2 1 the cat 

вам нужно что-то вроде:

cat input | sort | uniq -c | awk '{print $3 "\t" $4 "\t" $1}' 
3

uniq -c добавляет дополнительный столбец. Это должно дать вам выход вы хотите:

$ sort file | uniq -c | awk '{print $3 "\t" $4 "\t" $1}' 
cat  plays 1 
dog  eats 1 
horse runs 1 
red  dog  1 
the  cat  2 
2

С awk и sort:

$ awk '{a[$2 OFS $3]++}END{for(k in a)print k,a[k]}' OFS='\t' file | sort -nk3 
cat  plays 1 
dog  eats 1 
horse runs 1 
red  dog  1 
the  cat  2 
+0

Как работает '$ [$ 2 OFS $ 3] ++'? –

2

Если у вас есть GNU AWK (Gawk), вы можете использовать только его и его особенность функции asorti():

#!/usr/bin/env gawk -f 
{ 
    a[$2 "\t" $3]++ 
} 
END { 
    asorti(a, b) 
    for (i = 1; i in b; ++i) print b[i] "\t" a[b[i]] 
} 

Одна линия:

gawk '{++a[$2"\t"$3]}END{asorti(a,b);for(i=1;i in b;++i)print b[i]"\t"a[b[i]]}' file 

Выход:

cat plays 1 
dog eats 1 
horse runs 1 
red dog 1 
the cat 2 

UPDATE: Для того, чтобы сохранить первоначальный порядок без сортировки использования:

#!/usr/bin/awk -f 
!a[$2 "\t" $3]++ { 
    b[++i] = $2 "\t" $3 
} 
END { 
    for (j = 1; j <= i; ++j) print b[j] "\t" a[b[j]] 
} 

Или

awk '!a[$2"\t"$3]++{b[++i]=$2"\t"$3}END{for(j=1;j<=i;++j)print b[j]"\t"a[b[j]]}' file 

Любая версия AWK будет совместима с этим в этот раз.

Вывод должен быть таким же на этот раз, поскольку вход уже отсортирован по умолчанию.

Смежные вопросы