как перенести значения два на два с помощью оболочки?

#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
  • используются две замены:
    1. первая замена с (([^,]*,){2}) помощью part фиксирует сразу два числа, разделенных запятыми, и сохраняет их в 1 для повторного использования: 1 выполняется в вашем примере при первом совпадении: 3.172704445659,50.011996744997, . Обратите внимание: присутствуют обе запятые.
      • (([^,]*,){2}) означает захват последовательности, состоящей НЕ из запятой — то есть [^,]* части, за которой следует ,
      • нам нужны две такие последовательности — это (...){2} часть
      • и мы хотим захватить его для повторного использования в 1 — это внешняя пара круглых скобок
      • затем замените на 1n -, который просто вставляет новую строку после совпадения, другими словами, новую строку после каждой второй запятой
    2. поскольку теперь у нас есть запятая перед новой строкой, от которой нам нужно избавиться, мы делаем вторую замену для достижения этой цели:
      • s/,n/n/g
      • запятая, за которой следует новая строка, заменяется только новой строкой — другими словами, запятая удаляется

Ответ №4:

awk и sed являются мощными инструментами, и фактически представляют собой языки программирования сами по себе. Таким образом, они, конечно, могут легко справиться с этой задачей.

Но так же может bash быть, что будет иметь преимущества большей переносимости (отсутствие внешних зависимостей) и более быстрого выполнения (поскольку он использует только встроенные функции).:

 IFS=$', n'
values=($(</path/to/file))
printf '%.13f %.13fn' "${values[@]}"