Я пытаюсь преобразовать текстовый файл в таблицу, разделенную табуляцией. Мой текстовый файл выглядит примерно так:
Dog
Cat
Fish
Lizard
Wolf
Lion
Shark
Gecko
Coyote
Puma
Eel
Iguana
Стандартные функции поиска и замены в Gedit или LibreOffice позволяют легко заменить конец строки вкладкой. Но если я просто поменяю возврат каретки на вкладки, я получу это:
Dog Cat Fish Lizard Wolf Lion Shark Gecko Coyote Puma Eel Iguana
Но мне нужно сделать так, чтобы это выглядело так:
Dog Cat Fish Lizard
Wolf Lion Shark Gecko
Coyote Puma Eel Iguana
Итак, можно ли поменять местами все символы конца строки для табуляции, кроме каждой четвертой строки?
Я не знаю, можно ли выполнить такую условную итерацию с помощью регулярных выражений внутри такой программы, как Gedit или LibreOffice, поэтому, возможно, это должна быть какая-то функция командной строки? Я даже не знаю, с чего лучше начать.
Обновить:
Я попробовал следующие команды:
sed 'N;N;N;s/\n/\t/g' file > file.tsv
paste - - - - < file > file.tsv
pr -aT -s$'\t' -4 file > file.tsv
xargs -d '\n' -n4 < inputfile.txt
Но когда я пытаюсь открыть полученный tsv
файл в LibreOffice, столбцы не совсем правильные. Я не уверен, означает ли это, что я не выполняю вышеуказанные команды правильно, или я делаю что-то неправильно в функции импорта LibreOffice:
Просто для справки, желаемый результат должен выглядеть так:
источник
dos2unix
иunix2dos
.Вы можете использовать,
xargs
чтобы всегда группировать четыре строки в одну, разделенную одним пробелом:-d '\n'
устанавливает в качестве разделителя ввода символ новой строки, в противном случае он также будет разбит на пробелы. Если у вас есть только одно слово на строку ввода, вы можете даже опустить это.-n4
устанавливает номер аргумента (количество входных элементов в выходной строке) равным 4.Выход:
Или, если вы хотите использовать табуляцию как разделитель вместо пробела, вы можете заменить их позже. Однако, если у вас есть пробелы во входных строках, они также будут заменены:
Вывод (смотрите в зависимости от ширины вкладки браузера / терминала):
источник
Вы также можете использовать:
Две встроенные переменные awk:
ORS
: O utput R ecord S eparator ( по умолчанию = новая строка). Он добавляется в конце каждой команды печати.NR
: N умбра текущего R вл AWK обрабатывает.Эта команда для каждой строки отображает содержимое первого (и только здесь) столбца. Затем он решает добавить новую строку или вкладку, протестировав остаток от деления
NR
на 4.источник
Еще один кратчайший
awk
подход:Это Printf только один столбец с последующим рядом и рядом и ... и ушко
\t
характер после того, как каждый , но будет PRINTF в\n
ewline характер , когда N хариус из R ecord был фактор 4 (гдеNR%4
будет возвращать 0 (ложь) , которая является то , что оператор троичногоcondition(s)?when-true:when-false
делается.)источник
Мое решение этого было бы использовать комбинацию
sed
иsed
. Во-первых, вы можете пометить каждую четвертую строку каким-нибудь специальным символом, например>
, используя это решение:В этом случае вы хотите начать со строки 5 и отмечать каждую четвертую строку после нее. В GNU
sed
это может быть дано как адрес5~4
. Вы можете использовать эту команду:Затем вам нужно удалить символы новой строки, что можно сделать с помощью
sed
цикла:Существуют более простые способы преобразования строк в какой-либо другой символ, например с помощью
tr
:В любом случае, объединение двух дает
(
sed
версия оставляет завершающий символ новой строки, аtr
версия - нет)После этого вам нужно только конвертировать вставленные вами специальные символы в новые строки; см., например, Преобразование файла с разделителями табуляции для использования новых строк . В этом случае перейдите
>
на новую строку:Команда
y
выполняет ту же функцию, чтоtr
и преобразование одного символа в другой, но здесь вы можете использоватьs
команду одинаково хорошо. При помощиs
вам нужноg
оперировать каждым совпадением в строке (sed 's/>/\n/g'
).Вместо создания двух промежуточных файлов вы можете использовать каналы:
Если конечные пробелы являются проблемой, вы можете добавить еще одну команду для их удаления:
источник
Ради «полноты» вот чистое решение bash:
Работает также с пробелами, при условии, что
IFS
правильно установлен (что должно по умолчанию, AFAIK). Более того, я думаю , что это может быть даже сценарий переносимой оболочки, работающий с любой POSIX-совместимой оболочкой.источник
$'
'
POSIX не требует формы цитирования. Например, вdash
(который обеспечиваетsh
по умолчанию в Ubuntu) работаетprintf '%s\n' $'a\tb'
только вывод$a\tb
. Это не значит, что это бесполезно; это работает в Bash. Однако, как и в случае с некоторыми другими решениями, опубликованными людьми, он выдает неполный вывод, если число строк ввода не кратно четырем. Кроме того, я рекомендую использоватьread -r
, так как нет никаких оснований думать, что расширение выходных данных обратной косой черты во входном файле желательно здесь.printf '%s\t%s\t%s\t%s\n' "$one" "$two" "$three" "$four"
Макрос vim (записанный с помощью q) может применить вашу операцию, затем пропустить три строки. Затем вы просто запускаете этот макрос n раз.
например:
источник
Так как вы попросили решение Gedit, что-то вроде этого должно работать:
Найти:
Заменить:
Убедитесь, что флажок для регулярных выражений отмечен.
Как это устроено:
Первый шаг - найти последовательность символов слова с \ w + и записать результаты в переменную \ 1, заключив скобки в выражение:
Затем мы ищем серию символов конца строки, \ r и \ n, или CR и LF. Так как файлы в формате Windows используют оба, мы создаем класс символов, заключая эти два символа в квадратные скобки. Плюс заставляет его искать один или несколько символов:
Наконец, мы повторяем это еще 3 раза, сохраняя каждое последующее слово в переменных \ 2, \ 3 и \ 4. Это делает нашу замену выражением простым. Нам просто нужно поместить символы табуляции \ t и символ новой строки \ n в соответствующие места для форматирования, которое вам нужно.
источник