Объединяйте все остальные столбцы с помощью sed или awk

Объединяйте все остальные столбцы с помощью sed или awk

У меня есть большой текстовый файл (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

Связанный контент