Как добавить пробелы в определенные столбцы файла в Linux

Вы можете попробовать ed, которого, к сожалению, нет в стандартной установке Debian.

printf '%s\n' \
 'g/[^[:blank:]][^[:blank:]]*/kx' \
 "'"'x,$j' \
 '$s/[[:blank:]]*$//' \
 '/[^[:blank:]][^[:blank:]]*/kx' \
 '1,'"'"'xj' \
 '1s/^[[:blank:]]*//' \
 'wq' | 
ed -s infile

Или с гну сэд

sed -Ezi 's/^\s+|\s+$//g;s/$/\n/' infile
3
19.04.2020, 21:36
5 ответов

Использование любого awk в любой оболочке на каждом компьютере UNIX и возможность указать, какой столбец следует изменить, независимо от символов в этом столбце:

$ awk -v c=1 '{gsub(/../,"& ",$c); sub(/ $/,"",$c)}1' file
00 11 22 abc def ghi
33 44 55 xyz aaa bbb
66 77 88 ccc ccc ddd

$ awk -v c=2 '{gsub(/../,"& ",$c); sub(/ $/,"",$c)}1' file
001122 ab c def ghi
334455 xy z aaa bbb
667788 cc c ccc ddd

$ awk -v c=3 '{gsub(/../,"& ",$c); sub(/ $/,"",$c)}1' file
001122 abc de f ghi
334455 xyz aa a bbb
667788 ccc cc c ddd
4
19.03.2021, 02:28

Полная лень печатать здесь,

sed -E "s/([0-9]{2})/\1 /g; s/ +/ /g" file1

Поставьте пробел после каждой пары цифр, а затем уменьшите несколько пробелов до одного элемента.

Или, может быть, еще ленивее

sed 's/./& /4;s/./& /2' file1
2
19.03.2021, 02:28

Общая версия для любого количества/положения пробелов в awk :

awk -v s='2,4' '{f=!split(s,a,",");for(i in a){r="^.{"a[i]+f++"}";gsub(r,"& ")}}1'
00 11 22 abc def ghi
⋮

Более мощная версия, в которую можно вставлять другие символы, кроме пробела:

spacers(){
  awk -v s="$1" '{f=!split(s,a,/[^*0-9]*/);split(s,p,/[*0-9]*/);
                  for(i in a){if(""==b=a[i])continue;
                    r="^.{"(b!="*"?b+f++:length($0))"}";
                    gsub(r,"&"p[i+1])}}                          1' $2;}

Таким образом, вы можете сделать, например.:

spacers '0|2 4 6|10@yahoo.com |* |' file
|00 11 22| abc@yahoo.com | def ghi |

, который отлично подходит для создания таблиц организационного -режима и прямой передачи в буфер обмена.

Примечание. :Функция оболочки -также принимает данные через STDIN.

(Более ранние версии этого ответа содержали общее решение awk -, которое использовало sed для окончательной замены)

3
19.03.2021, 02:28

Наивно, но прямо:

$ sed 's/\(..\)\(..\)\(..\)/\1 \2 \3/' file
00 11 22 abc def ghi
33 44 55 xyz aaa bbb
66 77 88 ccc ccc ddd

То есть сопоставьте и соберите три первые группы из двух символов в каждой строке и разделите их пробелами, вставив пробелы в строку замены.

Необычно, но требует размышлений:

$ sed 's/../ &/3; s/../ &/2' file
00 11 22 abc def ghi
33 44 55 xyz aaa bbb
66 77 88 ccc ccc ddd

Это первое выражение заменяет третье совпадение ..в каждой строке пробелом, за которым следует то, что совпадает с ... Потом снова, но уже на 2-й матч.

5
19.03.2021, 02:28

Если входные данные точно такие, как изображено, GNU cutявляется вариантом. Обратите внимание, что --output-delimiterдолжен быть явно задан пробелом. Это создает очень жесткое решение, в отличие от некоторых других ответов, в котором отсутствует как гибкость для работы с переменной длиной строки в первом поле, так и возможность назначать произвольное поле для работы.

cut -c1-2,3-4,5- --output-delimiter=' ' <file
00 11 22 abc def ghi
33 44 55 xyz aaa bbb
66 77 88 ccc ccc ddd
2
19.03.2021, 02:28

Теги

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