日期时间到纪元转换

时间:2017-02-05 17:40:46

标签: bash awk epoch

我有一个bash问题(使用awk时)。我正在提取文本文件中第一列和第五列的每个实例,并使用以下代码将其管道到一个新文件,

cut -f4 test170201.rawtxt | awk '/stream_0/ { print $1, $5  }' > testLogFile.txt 

这是文件的一部分(test170201.rawtxt)我正在从列TimestampLoss中提取数据,

Timestamp                 Stream     Status     Seq         Loss Bytes    Delay
17/02/01.10:58:25.212577  stream_0     OK      80281          0  1000     38473
17/02/01.10:58:25.213401  stream_0     OK      80282          0  1000     38472
17/02/01.10:58:25.215560  stream_0     OK      80283          0  1000     38473
17/02/01.10:58:25.216645  stream_0     OK      80284          0  1000     38472

这是我在testLogFile.txt

中得到的结果
17/02/01.10:58:25.212577 0
17/02/01.10:58:25.213401 0
17/02/01.10:58:25.215560 0
17/02/01.10:58:25.216645 0

但是,我希望Timestamp在上面的文件中写在epoch中。是否有一种简单的方法来修改我已经拥有的代码?

3 个答案:

答案 0 :(得分:3)

假设:

list.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

            if (finalDialog != null && finalDialog.isShowing()) {
                  finalDialog.dismiss();
             }
            mListener.onActionSelected((DialogFragment) getParentFragment(), position);
            Log.d(FileListActivity.TAG, "Dismissing dialog");
    //      ActionsDialogFragment.this.dismiss();
        }
    });

您可以编写POSIX Bash脚本来执行您要查找的内容:

$ cat file
Timestamp                 Stream     Status     Seq         Loss Bytes    Delay
17/02/01.10:58:25.212577  stream_0     OK      80281          0  1000     38473
17/02/01.10:58:25.213401  stream_0     OK      80282          0  1000     38472
17/02/01.10:58:25.215560  stream_0     OK      80283          0  1000     38473
17/02/01.10:58:25.216645  stream_0     OK      80284          0  1000     38472

对于GNU日期,请尝试:

while IFS= read -r line || [[ -n "$line" ]]; do
    if [[ "$line" =~ ^[[:digit:]]{2}/[[:digit:]]{2}/[[:digit:]]{2} ]]
    then
        arr=($line)
        ts=${arr[0]}
        dec=${ts##*.}   # fractional seconds
        # GNU date may need different flags:
        epoch=$(date -j -f "%y/%m/%d.%H:%M:%S" "${ts%.*}" "+%s")
        printf "%s.%s\t%s\n" "$epoch" "$dec" "${arr[4]}"
    fi  
    done <file >out_file

$ cat out_file
1485975505.212577   0
1485975505.213401   0
1485975505.215560   0
1485975505.216645   0

对于GNU while IFS= read -r line || [[ -n "$line" ]]; do if [[ "$line" =~ ^[[:digit:]]{2}/[[:digit:]]{2}/[[:digit:]]{2} ]] then arr=($line) ts="20${arr[0]}" d="${ts%%.*}" tmp="${ts%.*}" tm="${tmp#*.}" dec="${ts##*.}" # fractional seconds epoch=$(date +"%s" --date="$d $tm" ) printf "%s.%s\t%s\n" "$epoch" "$dec" "${arr[4]}" fi done <file >out_file 解决方案,您可以执行以下操作:

awk

如果您不希望在纪元中包含小数秒,则可以轻松删除它们。

答案 1 :(得分:1)

awk -F '[.[:blank:]]+' '
   # use separator for dot and space (to avoid trailing time info)

   {
   # for line other than header
   if( NR>1) {
      # time is set for format "YYYY MM DD HH MM SS [DST]"
      #  prepare with valuable info
      T = "20"$1 " " $2
      # use correct separator
      gsub( /[\/:]/, " ", T)
      # convert to epoch
      E = mktime( T)

      # print result, adding fractionnal as mentionned later
      printf("%d.%d %s\n", E, $3, $7)
      }
     else {
        # print header (line 1)
        print $1 " "$7
        }
    }
   ' test170201.rawtxt \
   > Redirected.file
  • 自我评论,为了理解目的,代码更长
  • 使用gnu awk作为posix或旧版本中不可用的 mktime 功能

后,Oneliner在这里进行了一些优化
awk -F '[.[:blank:]]+' '{if(NR>1){T="20"$1" "$2;gsub(/[\/:]/," ", T);$1=mktime(T)}print $1" "$7}' test170201.rawtxt

答案 2 :(得分:0)

使用 GNU awk

<强>输入

$ cat f
Timestamp                 Stream     Status     Seq         Loss Bytes    Delay
17/02/01.10:58:25.212577  stream_0     OK      80281          0  1000     38473
17/02/01.10:58:25.213401  stream_0     OK      80282          0  1000     38472
17/02/01.10:58:25.215560  stream_0     OK      80283          0  1000     38473
17/02/01.10:58:25.216645  stream_0     OK      80284          0  1000     38472

<强>输出

$ awk '
BEGIN{cyear = strftime("%y",systime())}
function epoch(v,       datetime){
    sub(/\./," ",v);
    split(v,datetime,/[/: ]/); 
    datetime[1] = datetime[1] <= cyear ? 2000+datetime[1] : 1900+datetime[1];
    return mktime(datetime[1] " " datetime[2] " " datetime[3] " " datetime[4]" " datetime[5]" " datetime[6])
}
/stream_0/{
    print epoch($1),$5
}' f



1485926905 0
1485926905 0
1485926905 0
1485926905 0

要写入新文件,只需重定向,如下所示

cut -f4 test170201.rawtxt | awk '
BEGIN{cyear = strftime("%y",systime());}
function epoch(v,       datetime){
    sub(/\./," ",v);
    split(v,datetime,/[/: ]/); 
    datetime[1] = datetime[1] <= cyear ? 2000+datetime[1] : 1900+datetime[1];
    return mktime(datetime[1] " " datetime[2] " " datetime[3] " " datetime[4]" " datetime[5]" " datetime[6])
}
/stream_0/{
    print epoch($1),$5
}'  > testLogFile.txt