首页 > 解决方案 > 将每行的一部分修改为新值的 shell 脚本

问题描述

我有一个文件,每行包含一个日期时间值我有一个命令可以将所有值更改为今天的日期,但我不仅需要能够更改为今天,而且假设前 10 行更改为今天,接下来的 10 行要更改为昨天的日期,依此类推。你能帮我解决这个问题吗?

文件片段:

bla|TRANSACTTIME=20181127153310|bla|bla
bla|TRANSACTTIME=20181127153310|bla|bla
bla|TRANSACTTIME=20181127153310|bla|bla
bla|TRANSACTTIME=20181127153310|bla|bla

标签: shelldatedatetime

解决方案


我认为这应该有效,

#!/bin/bash
set +x

STEP=3            #size of the block you want to modify
DATE_STEP=1       #how many days you want to step
BASEDATE=20181127 #basedate you want to replace

LINES=$(cat $1 | wc -l)
BLOCKS=$((LINES / STEP ))
MODULE=$((LINES % STEP ))
if [ "$MODULE" -ne "0" ];
then
    BLOCKS=$((BLOCKS + 1))
fi

START=1
END=$STEP
ADD_DAYS=0
for i in $(seq 1 $BLOCKS);
do
  NEWDATE=$(date +'%Y%m%d' -d"today+$ADD_DAYS days")

  #sed is used twice, first to get the required lines and then to do the replacement
  sed -n ${START},${END}p $1 | sed s/$BASEDATE/$NEWDATE/

  START=$((END + 1))
  END=$((END + STEP))
  ADD_DAYS=$((ADD_DAYS + DATE_STEP))
done

输出直接到标准输出


推荐阅读