#linux #bash #shell
#linux #баш #оболочка
Вопрос:
У меня есть мои данные в файловом хранилище по строкам, подобным этому :
3.172704445659,50.011996744997,3.1821975358417,50.012335988197,3.2174797791605,50.023182479597
И я хотел бы получить 2 столбца :
3.172704445659 50.011996744997
3.1821975358417 50.012335988197
3.2174797791605 50.023182479597
Я знаю команду sed для удаления ‘,’ (sed «s /, / /»), но я не знаю, как «вернуться к строке» каждые две цифры?
У вас есть какие — нибудь идеи ?
Ответ №1:
Один в awk:
$ awk -F, '{for(i=1;i<=NF;i )printf "%s%s",$i,(i*mp;amp;i!=NF?OFS:ORS)}' file
Вывод:
3.172704445659 50.011996744997
3.1821975358417 50.012335988197
3.2174797791605 50.023182479597
Ответ №2:
Решение, жизнеспособное для тех, кто не знает awk
команды — простой for
цикл над массивом чисел.
IFS=',' read -ra NUMBERS < file
NUMBERS_ON_LINE=2
INDEX=0
for NUMBER in "${NUMBERS[@]}"; do
if (($INDEX==$NUMBERS_ON_LINE-1)); then
INDEX=0
echo "$NUMBER"
else
((INDEX ))
echo -n "$NUMBER "
fi
done
Комментарии:
1.
printf
твой друг.
Ответ №3:
Поскольку вы уже пробовали sed
, вот решение с использованием sed:
sed -r "s/(([^,]*,){2})/1n/g; s/,n/n/g" YOURFILE
-r
использует расширенное регулярное выражение sed- используются две замены:
- первая замена с
(([^,]*,){2})
помощью part фиксирует сразу два числа, разделенных запятыми, и сохраняет их в1
для повторного использования:1
выполняется в вашем примере при первом совпадении:3.172704445659,50.011996744997,
. Обратите внимание: присутствуют обе запятые.(([^,]*,){2})
означает захват последовательности, состоящей НЕ из запятой — то есть[^,]*
части, за которой следует,
- нам нужны две такие последовательности — это
(...){2}
часть - и мы хотим захватить его для повторного использования в
1
— это внешняя пара круглых скобок - затем замените на
1n
-, который просто вставляет новую строку после совпадения, другими словами, новую строку после каждой второй запятой
- поскольку теперь у нас есть запятая перед новой строкой, от которой нам нужно избавиться, мы делаем вторую замену для достижения этой цели:
s/,n/n/g
- запятая, за которой следует новая строка, заменяется только новой строкой — другими словами, запятая удаляется
- первая замена с
Ответ №4:
awk
и sed
являются мощными инструментами, и фактически представляют собой языки программирования сами по себе. Таким образом, они, конечно, могут легко справиться с этой задачей.
Но так же может bash
быть, что будет иметь преимущества большей переносимости (отсутствие внешних зависимостей) и более быстрого выполнения (поскольку он использует только встроенные функции).:
IFS=$', n'
values=($(</path/to/file))
printf '%.13f %.13fn' "${values[@]}"