Я новичок в emacs, но могу предложить следующее:
M-b to move backward over a word
M-d to kill up to the end of the word
Теперь вы можете написать новое слово. Работает почти как cw
в vim
Как всегда с такими вопросами, было бы лучше исправить процесс, который создает данные, в первую очередь, а не добавлять к процессу стадию постобработки -. Сказав это, вот что вы можете сделать.
$ 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 дефисами.
Поможет ли продолжение чтения строк, пока не будет достигнуто количество полей? Из другого поста:
awk -F'\t' '
{while (NF<996) {getline X
$0 = $0 FS X
}
}
1
' file