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

Это даст вам дату в секундах (с эпохи UNIX)

date --date '2017-08-17 04:00:01' +%s    # "1502938801"

И это даст вам дату в виде читаемой строки из нескольких секунд

date --date '@1502938801'    # "17 Aug 2017 04:00:01"

Таким образом, все, что вам нужно, это преобразовать вашу дату/временную метку в формат, понятный GNU date, использовать математику для определения разницы и вывести результат

datetime1=20170817040001
datetime2=20160312000101

# bash string manipulation
datestamp1="${datetime1:0:4}-${datetime1:4:2}-${datetime1:6:2} ${datetime1:8:2}:${datetime1:10:2}:${datetime1:12:2}"
datestamp2="${datetime2:0:4}-${datetime2:4:2}-${datetime2:6:2} ${datetime2:8:2}:${datetime2:10:2}:${datetime2:12:2}"

# otherwise use sed
# datestamp1=$(echo "$datetime1" | sed -nr 's/(....)(..)(..)(..)(..)(..)/\1-\2-\3 \4:\5:\6/p')
# datestamp2=$(echo "$datetime2" | sed -nr 's/(....)(..)(..)(..)(..)(..)/\1-\2-\3 \4:\5:\6/p')

seconds1=$(date --date "$datestamp1" +%s)
seconds2=$(date --date "$datestamp2" +%s)

delta=$((seconds1 - seconds2))
echo "$delta seconds"    # "45197940 seconds"

Мы не предоставили здесь информацию о часовом поясе, поэтому предполагается местный часовой пояс. Ваши значения секунд от даты и времени, вероятно, будут отличаться от моих. (Если ваши значения UTC, вы можете использовать date --utc.)

-4
27.11.2019, 23:12
1 ответ

Если я правильно понимаю вашу проблему:

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

prods1=() #product names in file 1
tots1=() #totals in file 1

prods2=() #product names in file 2
tots2=() #totals in file 2


#read in the stored values
while IFS=\t read -r p t; do
    prods1+=("$p")
    tots1+=("$t")
done <<< file1

while IFS=\t read -r p t; do
    prods2+=("$p")
    tots2+=("$t")
done <<< file2

output=() #will store your output

for((i=0; i<${#tots1[@]};++i)); #you can set i to 1 if you want to skip the headers
do
    #check if the values are equivalent
    if ((${tots1[i]} == ${tots2[i]}));
        output+="They are equal"

        #ADD THE REST OF THE COMPARISONS HERE
    fi
done

После этого массив outputбудет содержать желаемый вывод, и вы сможете вывести его на консоль или в файл в любом удобном для вас формате:)

0
28.01.2020, 05:20

Теги

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