Вопрос неизвестное пространство между цифрами после команды echo


У меня есть три текстовых файла данных:

год:

2014
2014
2014

месяц:

03
03
03

день:

08
09
10

Я использую эту функцию, чтобы объединить их в дату:

function pl {                
  sed -n "$1p" $2
}

for (( j=1; j <= 3; j++ ))
do
    yr=$(pl $j year)
    mnth=$(pl $j month)
    dy=$(pl $j day)
    date_format=$yr-$mnth-$dy
    echo $date_format
done

Мой вывод, однако, выглядит так:

2014 -03-08
2014 -03-09
2014 -03-10

Мне нужно удалить пробел между «2014» и «-». Другие коды используют $ date_format, поэтому между символами не должно быть пробелов.


1
2017-10-21 13:13


происхождения


Почему бы вам просто не сказать paste -d"-" year month day? У вас довольно много [для меня ненужного] кода. - fedorqui
fyi, я просто попробовал свой код и дал мне правильные результаты -2014-03-08 2014-03-09 2014-03-10, Возможно, у вас есть пробел после 2014 года в файле год,


ответы:


Вот быстрое решение, чтобы избавиться от пробелов в вашем $date_format переменная:

date_format=${date_format//[[:space:]]/}
echo "$date_format"

1
2017-10-21 13:16



Как сохранить дату_формат для создания цикла после этого - deepblue_86
Не уверен, что я прекрасно понимаю, что вам нужно, но вы можете хранить date_format в другой переменной для последующего использования. - A.P.
Извините моя ошибка - deepblue_86


Если вы получаете этот результат, у вас есть конечное место в вашем year файл. Это работает точно так, как ожидалось, если вы этого не сделаете:

$ printf "2013\n2013\n2013\n" > year; printf "03\n03\n03\n" "03" > month; printf "08\n09\n10\n" > day
$ for (( j=1; j <= 3; j++ )); do
    yr=$(pl $j year)
    mnth=$(pl $j month)
    dy=$(pl $j day)
    date_format=$yr-$mnth-$dy
    echo $date_format
done
2013-03-08
2013-03-09
2013-03-10

И, если вы добавите конечное пространство:

$ printf "%s2013 \n2013 \n2013 \n" > year
$ for (( j=1; j <= 3; j++ )); do
>     yr=$(pl $j year)
>     mnth=$(pl $j month)
>     dy=$(pl $j day)
>     date_format=$yr-$mnth-$dy
>     echo $date_format
> done
2013 -03-08
2013 -03-09
2013 -03-10

Итак, самым простым решением является удаление пространства из вашего входного файла:

sed -i 's/ *$//' year

Обратите внимание, однако, что вы используете очень сложное решение для очень простой задачи:

$ paste -d"-" year month day | tr -d ' '
2013-03-08
2013-03-09
2013-03-10

1
2017-10-21 14:22





Удалите все после года / месяца / дня непосредственно в sed команда;

в pl() заменить функцию

sed -n "$1p" $2

с

sed -n "$1s/\([0-9]*\).*/\1/p" $2

0
2017-10-21 13:18



он дает - строки, я имею в виду, что не работает должным образом - deepblue_86
на этот раз дает; 2014-- - deepblue_86
@ deepblue_86 Плохо, моя первая команда (-а) была фактически неправильной. Это должно сработать. - kos