Unix-скрипт для объединения данных из разных рядов в одну строку

Я новичок в emacs, но могу предложить следующее:

M-b       to move backward over a word
M-d       to kill up to the end of the word

Теперь вы можете написать новое слово. Работает почти как cw в vim

0
11.12.2018, 12:47
2 ответа

Как всегда с такими вопросами, было бы лучше исправить процесс, который создает данные, в первую очередь, а не добавлять к процессу стадию постобработки -. Сказав это, вот что вы можете сделать.

$ cat file
1       2
3
1       2       3
1
2
3
$ awk -v w=3 -f script.awk file
1       2       3
1       2       3
1       2       3

Этот awkскрипт будет собирать поля с разделителями табуляции -из ввода до тех пор, пока не будет собрано заданное количество полей. Затем он выведет эти собранные поля как свою собственную строку, прежде чем продолжить чтение из ввода.

Количество полей в выводе определяется значением w, которое передается в командной строке, как показано выше. Обратите внимание, что это количество полей , а не количество символов табуляции.

BEGIN { OFS = FS = "\t" }

function output_line () {
    # a function that outputs the nf elements in the array a
    # separated by OFS (tab) and terminated by ORS (newline)

    for (j = 1; j < nf; ++j)
        printf("%s%s", a[j], OFS)

    printf("%s%s", a[nf], ORS)
}

{
    # a:  an array of fields that we want to output together
    # nf: the length of that array

    # just add each field to the a array
    for (i = 1; i <= NF; ++i) {
        a[++nf] = $i

        # if enough has been read, output the collected data
        if (nf == w) {
            output_line()
            nf = 0
        }
    }
}

END {
    # output any data remaining in a
    if (nf > 0)
        output_line()
}

Это то же самое, что и

tr '\t' '\n' <file | paste - - -

для моего небольшого примера. В вашем случае вы можете использовать сценарий awkвыше с -v w=996или ввести команду tr+ pasteс 996 дефисами.

1
28.01.2020, 02:41

Поможет ли продолжение чтения строк, пока не будет достигнуто количество полей? Из другого поста:

awk -F'\t' '
        {while (NF<996) {getline X
                         $0 = $0 FS X
                        }
        }
1
' file
0
28.01.2020, 02:41

Теги

Похожие вопросы