У меня есть большой текстовый файл (666000 столбцов) в формате
A B C D E F
Желаемый результат
AB CD EF
Как мы можем сделать это в sed
или awk
. Я пробовал пару вещей, но ничего не работает. Пожалуйста, предложите что-нибудь.
решение1
В sed
:
sed 's! \([^ ]\+\)\( \|$\)!\1 !g' your_file
Это выполнит замены и выведет результат на стандартный вывод. Чтобы изменить файл на месте, добавьте переключатель -i
:
sed -i 's! \([^ ]\+\)\( \|$\)!\1 !g' your_file
Объяснение
Эта sed
команда будет искать пробел, за которым следует хотя бы один непробельный символ, за которым следует пробел или конец строки. Она заменяет эту последовательность любыми найденными непробельными символами, за которыми следует один пробел. Замена применяется столько раз, сколько возможно по всей строке (это называется глобальной заменой), потому что модификатор g
указан в конце. Так что, по сути, с последовательностью типа A B C
, sed
найдет шаблон " B " и заменит его на " B ", оставив вам AB C
в качестве конечного результата.
Предположения, сделанные этим кодом
Этот код предполагает, что пробелы между вашими столбцами на самом деле являются пробелами, а не символами TAB, например. Это можно легко исправить за счет читабельности:
sed 's![[:blank:]]\+\([^[:blank:]]\+\)\([[:blank:]]\+\|$\)!\1 !g' your_file
решение2
awk:
awk '{printf $1$2;for(i=3; i<=NF;i+=2){printf " %s",$i$(i+1)}print}' file
Вероятно, это будет самый быстрый из двух вариантов для больших файлов.
Перл:
perl -pe 's/([^\s]+)\s+([^\s]+)/$1$2/g' file
решение3
Если в вашем файле действительно так много столбцов, один из вариантов — использовать gawk для обработки каждого столбца как записи, установив RS
значение «один или несколько пробельных символов». Это помогает избежать необходимости создания цикла по столбцам. Обратите внимание, что это решение хрупкое, если в строке нечетное количество столбцов.
awk --re-interval -v RS='[[:space:]]{1,}' '{x=$0; getline; printf x$0RT}' file