Присоединитесь к любому столбцу с sed или awk

Я предполагаю, что Вы используете стандартную установку человечности, таким образом с помощью ext4 файловой системы. При запрете вручную прохождения через образа диска и соединения файлов (который является вне моего знания) я думаю, что единственная опция состояла бы в том, чтобы использовать утилиту восстановления после удаления (как: http://extundelete.sourceforge.net/)

Вплоть до я просто погуглил его, я на самом деле думал, что не было возможно легко восстановить файлы на ext3/4, и я никогда не использовал вышеупомянутую утилиту.

Для использования его необходимо будет загрузить живой дистрибутив Linux (например, knoppix) и загрузить виртуальную машину с тем образом диска, смонтированным в виртуальном CD-приводе. Определенно не загружайте свой VM нормальным способом, или он сделает восстановление данных еще тяжелее!

4
28.09.2013, 00:16
3 ответа

В 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 как конечный результат.

Предположения сделаны этим кодом

Этот код предполагает, что пробелы между Вашими столбцами являются действительно пробелами и не ВКЛАДКАМИ, например. Это может быть легко зафиксировано за счет удобочитаемости:

sed 's![[:blank:]]\+\([^[:blank:]]\+\)\([[:blank:]]\+\|$\)!\1 !g' your_file
3
27.01.2020, 20:54
  • awk:

    awk '{printf $1$2;for(i=3; i<=NF;i+=2){printf " %s",$i$(i+1)}print}' file 
    

    Это, вероятно, будет самым быстрым из двух для больших файлов.

  • Perl:

    perl -pe 's/([^\s]+)\s+([^\s]+)/$1$2/g' file
    
2
27.01.2020, 20:54

Если Ваш файл действительно имеет это много столбцов, одна опция состоит в том, чтобы использовать простофилю для обработки каждого столбца как записи путем установки RS к "одному или нескольким пробельным символам". Это помогает избежать необходимости настраивать цикл через столбцы. Обратите внимание, что это решение хрупко перед лицом нечетного числа столбцов в строке.

awk --re-interval -v RS='[[:space:]]{1,}' '{x=$0; getline; printf x$0RT}' file
0
27.01.2020, 20:54

Теги

Похожие вопросы