У меня есть файл с колонками. Смотрите ниже пример:
a b c ... z
1 2 3 ... 26
Я хотел бы поменять местами все столбцы, где 1-й становится последним, а второй становится последним ... и т. Д.
z y x ... a
26 25 24 ... 1
Есть ли один лайнер ( awk
или sed
), который делает это?
Я знаю, что можно использовать, awk
когда есть только пара столбцов, но я бы хотел сделать это для файлов с тысячами столбцов.
tac
делает это идеально для линий.
Я думаю, я ищу эквивалент для столбцов.
rev
не работает для меня, так как он также меняет содержимое в столбце.
text-processing
sed
awk
columns
user22519
источник
источник
perl -lane 'print join " ", reverse @F'
Ответы:
источник
Вы можете сделать это с помощью небольшого скрипта Python:
источник
Если вы не возражаете против Python, то эта строка будет менять порядок столбцов в каждой строке, разделенных пробелами:
Вышесказанное работает и с python2.7:
источник
Один способ использования
awk
.Содержание
infile
:Запустите следующую
awk
команду:Со следующим результатом:
источник
Это медленно, но у него есть одна функция выкупа. Он поддерживает ширину разделителей полей, когда они шире, чем один символ. FWIW: если вы запустите этот скрипт дважды, результат будет идентичен оригиналу.
Вот сценарий.
Вот некоторые временные сравнения. Тестовый файл содержал 1 строку.
источник
Вы можете использовать,
tac
вам просто нужно транспонировать ввод до и после. Это можно сделать с помощью калькулятора электронных таблицsc
и его сообщникаpsc
:Как видно здесь .
Это работает лучше всего, когда все столбцы заполнены.
входной_файл
выходной_файл
редактировать
Как отмечает PeterO,
sc
существует жесткое ограничение в 702 столбца, так что это максимальный размер, поддерживаемый этим методом.источник
1
->1.00
. Также я получаю ошибки для строк шириной более 702 полей. Похоже, что они связаны с числовым пределом 32768 ... но это довольно быстро, asis.-S
кpsc
команде должно интерпретировать все как строки. Что касается ограничения на столбцы 702, это жесткое ограничение, поскольку поддерживаются только столбцы от A до ZZ (26 + 26 * 26), я добавлю комментарий об этом.Этот конвейер быстрее, чем самый быстрый другой ответ на значительный фактор (см. Результаты). Он использует
tr
иtac
. Для этого нужно использовать 2 байта ASCII (\ x00- \ x7F), которых нет в ваших данных.\x00
как правило, хороший выбор, как есть\x01
, но вы можете использовать любой байт ASCII, которого нет в данных.В этом примере SPACE и TAB в качестве символов-разделителей. Разделители могут быть многобайтовыми или одиночными. Выходной разделитель - это один пробел.
Вот команда. Имя файла показывает
numberof fields
_xnumber of lines
Если вы хотите / должны проверить неиспользуемые байты, вы можете проверить заранее с помощью этого дополнительного
awk
сценария. Общее время, даже когда запускается этот необязательный скрипт, все еще значительно быстрее, чем другие методы (пока :)). Вот сценарий предварительной обработки.Это сценарий awk:
char-ascii-not-in-stream
Второй набор раз, для этого скрипта, включает
char-ascii-not-in-stream
время.источник
Вы также можете сделать это без печати f :
источник