shell 在unix中基于当前日期添加新列

vc9ivgsu  于 2023-02-09  发布在  Shell
关注(0)|答案(4)|浏览(128)

我正尝试在unix中基于时间戳列在最后一个单元格中添加状态列。我不确定如何继续。
预期I/p:

Date Location 
2023-02-08 02:19 /tmp/SA
2023-02-07 01:24 /tmp/SA2

预期输出:

Date Location  Status
2023-02-08 02:19 /tmp/SA  Success
2023-02-07 01:24 /tmp/SA2  Failure

我尝试了以下解决方案,但结果为空白:

awk '{ if ($1==date) print success; else $1!=date; print failure; }' file.txt
ruoxqz4g

ruoxqz4g1#

由于日期具有固定长度,因此提取它的简单方法是使用参数扩展(参见this答案)。
因此,您可以迭代input中的所有行,提取日期,然后简单地与所需的日期进行比较:

$ cat check_date.sh
#!/bin/bash

while read line; do

    date=${line:0:16}

    if [ "${date}" = "$1" ]; then
        echo "${line} Success"
    else
        echo "${line} Failure"
    fi  

done < input.txt

下面是一个示例运行:

$ cat input.txt
2023-02-08 02:19 /tmp/SA
2023-02-07 01:24 /tmp/SA2

$ ./check_date.sh "2023-02-08 02:19"
2023-02-08 02:19 /tmp/SA Success
2023-02-07 01:24 /tmp/SA2 Failure
qvtsj1bj

qvtsj1bj2#

看起来你需要解释一下如何让awk理解一个日期的样子。我的印象是你的日期格式满足下面的正则表达式:

[0-9][0-9][0-9][0-9]\-[0-9][0-9]\-[0-9][0-9]

我相信这样的检查是用awk中的~操作符完成的。

cgfeq70w

cgfeq70w3#

根据操作系统(BSDGNU等)的不同,以所需格式(%Y-%m-%d)获取日期可能会有所不同

BSDdate版本可能如下所示

% awk -v date="$(date +%Y-%m-%d)" -v OFS="\t" '
    NR>1{if(date == $1){print $0,"Success"} else {print $0,"Failure"}}' file
2023-02-08 02:19 /tmp/SA    Success
2023-02-07 01:24 /tmp/SA2   Failure
数据
% cat file
Date Location
2023-02-08 02:19 /tmp/SA
2023-02-07 01:24 /tmp/SA2
n6lpvg4x

n6lpvg4x4#

替代awk解决方案:
target_ts="2023-02-08 02:19"设置目标_ts变量。
'NR==1{$3="Status"}将“状态”标题列添加到标题记录。
NR>1&&d==$1" "$2{$4="Success"}对于数据记录,如果时间戳与target_ts匹配,则添加包含“成功”的第4列。
NR>1&&d!=$1" "$2{$4="Failure"}对于数据记录,如果时间戳与target_ts不匹配,则添加包含“失败”的第4列。
使用awk惯用语句“1”进行打印。
代码:

target_ts="2023-02-08 02:19"

awk -v d="$target_ts" '
NR==1{$3="Status"}
NR>1&&d==$1" "$2{$4="Success"}
NR>1&&d!=$1" "$2{$4="Failure"}1' file.dat

输出:

Date Location Status
2023-02-08 02:19 /tmp/SA Success
2023-02-07 01:24 /tmp/SA2 Failure

BASH备选方案:

#!/bin/bash

target_date="$1"
data_file="$2"

{
    read -r header ; printf "%s Status\n" "$header"
    while read -r line ; do
        case "${line:0:16}" in
            "${target_date}") status="Success" ;;
            *) status="Failure" ;;
        esac
        printf "%s %s\n" "$line" "$status"
    done
} < "$data_file"

脚本执行:(将时间戳作为第一个参数传递,将文件路径作为第二个参数传递)

./script "2023-02-08 02:19" file.dat

输出:

Date Location Status
2023-02-08 02:19 /tmp/SA Success
2023-02-07 01:24 /tmp/SA2 Failure

相关问题