У меня есть огромный файл, который имеет следующий формат:

#pair:  0   1   0   1   0   0   1   
0   0   1   
0   0   1   
0   0   1   
0   0   1   
0   0   1   
0   0   1   
0   0   1   
0   0   1   
0   0   1   
0   0   1   
0   0   1   
0   0   1   
0   0   1   
0   0   1   
0   0   1   
0   0   1   
0   0   1   
0   0   1   
0   0   1   
0   0   1   
0   0   1   
0   0   1   
0   0   1   
0   0   1   
0   0   1   
0   0   1   
0   0   1   
0   0   1   
0   0   1   
0   0   1   
0   0   1   
#pair:  1   2   0   1   1   0   0   
1   0   0   
1   0   0   
1   0   0   
1   0   0   
1   0   0   
1   0   0   
1   0   0   
1   0   0   
1   0   0   
1   0   0   
1   0   0   
1   0   0   
1   0   0   
1   0   0   
1   0   0   
1   0   0   
1   0   0   
1   0   0   
1   0   0   
1   0   0   
1   0   0   
1   0   0   
1   0   0   
1   0   0   
1   0   0   
1   0   0   
1   0   0   
1   0   0   
1   0   0   
1   0   0   
1   0   0   
#pair:  1   2   1   2   0   0   1

Я хотел бы найти каждую строку, которая начинается с "#pair:", и переместить последние 3 столбца непосредственно под этой строкой.Например:

#pair:  1   2   1   2   0   0   1

изменения в:

#pair:  1   2   1   2   
0   0   1

Как я могу сделать это с помощью команды, которая работает в Linux?

2 ответа2

1

Вы можете сказать sed чтобы сделать это:

sed '/^#/ s/'$'\t''\([0-9]'$'\t''[0-9]'$'\t''[0-9]\)$/\n\1/'
     ^    ^    ^     ^                                ^ ^
     |    |    |     |                                | |
     |  replace|   digit                              | What was remembered
line starts   tab                                     | in the 1st \(...\)
with a #                                           newline
1

Это немного многословно с awk:

awk '
    $1=="#pair:" {
        sep=""
        for (i=1; i<NF-2; i++) {
            printf "%s%s", sep, $i
            sep="\t"
        }
        print ""
        printf "%s\t%s\t%s\n", $(NF-2), $(NF-1), $NF
        next
    }
    1
' <<END
#pair:  0       1       2       3       4       5       6
0       0       1
#pair:  0       1       2       31      4       5       6
0       0       1
END
#pair:  0       1       2       3
4       5       6
0       0       1
#pair:  0       1       2       31
4       5       6
0       0       1

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .