Как прочитать входной файл, который иногда содержит лишние переводы строки?

Для продолжительности, включающей несколько месяцев или лет, которая должна ссылаться на конкретную дату, поскольку разные месяцы или разные годы имеют разную продолжительность.

Чтобы узнать, сколько лет/месяцев/дней осталось до 1327 дней, с помощью dateutils:

$ ddiff -f '%Y years, %m months, %d days' today "$(dadd now 1327)"
3 years, 7 months, 19 days

(вы можете иногда найти ddiffдоступным как datediffили dateutils.ddiff; то же самое дляdadd).

Вот что я получаю сейчас на 2017 -09 -25 (, потому что это с 2017 -09 -25 по 2021 -05 -14 ). Если бы я запустил это в 2018 -03 -01, я бы получил:

3 years, 7 months, 17 days

потому что это с 2018 -03 -01 по 2021 -10 -18.

И в тот 2018 -03 -01 день, 1327 дней назад даст 3 years, 7 months, 16 days.

Дополнительная информация на Как рассчитать и отформатировать продолжительность даты с помощью инструментов GNU, а не дату результата?

0
28.01.2020, 01:08
4 ответа

Это должно достичь того, что требуется:

#!/usr/bin/env bash

while read line; do
    declare -a array=($line)
    if  test ${#array[@]} != 3; then
        read line2
        array+=($line2)
    fi
    f1=${array[0]}
    f2=${array[1]}
    echo $f1 $f2
done

run with : test.sh < inputfile

Проверяет, содержит ли строка три элемента, если нет, присоединяется к следующей строке.

0
28.01.2020, 02:38

Поскольку вы все равно используете awk, почему бы не положиться на него полностью? Попробуйте

read f1 f2 <<< $(awk '{while (NF < 3) {getline X; $0 = $0 FS X};  print $1, $2}' file)
0
28.01.2020, 02:38

Вы можете использовать xargs -n3 -a inputfile, чтобы переупорядочить входной файл и поместить три элемента в каждую строку.

while read -r f1 f2 temp; do
  echo "f1=$f1"
  echo "f2=$f2"
done < <(xargs -n3 -a inputfile)
0
28.01.2020, 02:38

В предположении, что каждая хорошо сформированная -строка ваших входных данных состоит из трех слов (, которые здесь свободно определены как строки, не содержащие пробелов ), вы можете предварительно обработать свои входные данные:

<input_file tr -s '[:blank:]' '\n' | paste - - - | column -t

Здесь мы заменяем любой пустой символ (, включая <newline>символы ), одним <newline>, переставляя результат в строки из трех слов и красиво форматируя вывод — последний является ненужным, косметический шаг, учитывая ваш вопрос.

0
28.01.2020, 02:38

Теги

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