检查文件中各行的缺失时间戳并将其添加到其中

检查文件中各行的缺失时间戳并将其添加到其中

我有一个以下格式的文件:

ABCD 01206001022T01YA022T01YA022T07SO 09:20:38
ABCD 01206001022ACION 09:24:40
ABCD 04006001021S01UK 09:24:42
ABCD 7878696621321312 23213213213213
ABCD ASADSADSFSSDSSD 09:24:50

基本上除了第一个字段外,其他字段都不同。

要求:我想要每行都有时间戳。如果任何行缺少时间戳,我想将前一行的时间戳附加到缺少行的末尾(上面的示例第 4 行)。我怎样才能实现这个目标?

答案1

awk应该可以做到:

awk '{ 
         if ( $NF ~ /[0-9]+:[0-9]+:[0-9]+/ ) {
            lasttime = $NF
            print
         } else {
            print $0, lasttime
         }
     }' < myfile.txt

答案2

这是一个 bash 解决方案,以防万一。它确实使用了单个awk,但如果需要的话可能可以重构:

while read line ; do
  ncol=$(echo "$line" | awk '{print $NF}')
  if [[ "$ncol" == *:*:* ]]; then
    tmstmp="$ncol"
    echo "$line"
    continue
  fi
  echo "$line $tmstmp"

done < 82031.txt

该文件82031.txt包括以下内容:

ABCD 01206001022T01YA022T01YA022T07SO 09:20:38
ABCD 01206001022ACION 09:24:40
ABCD 04006001021S01UK 09:24:42
ABCD 7878696621321312 23213213213213
ABCD ASADSADSFSSDSSD 09:24:50

运行上面的脚本会产生以下结果:

ABCD 01206001022T01YA022T01YA022T07SO 09:20:38
ABCD 01206001022ACION 09:24:40
ABCD 04006001021S01UK 09:24:42
ABCD 7878696621321312 23213213213213 09:24:42
ABCD ASADSADSFSSDSSD 09:24:50

纯 Bash 解决方案

这是一个只使用 Bash 的替代方案。我们没有awk从 .txt 文件的输入行中提取最后一列,而是read在循环中使用 Bash 命令while。这些选项-ra禁用反斜杠作为转义字符 ( -r),并-a使用分隔符分割输入$IFS,将每个原子的文本放入数组中的一个元素中${line[@]}

while IFS=" " read -ra line ; do
  ncol="${line[@]: -1:1}"
  if [[ "$ncol" == *:*:* ]]; then
    tmstmp="$ncol"
    echo "${line[@]}"
    continue
  fi
  echo "${line[@]} $tmstmp"

done < 82031.txt

该位${line[@]: -1:1}提取数组的最后一列${line[@]}

答案3

另一种 bash 解决方案

[[ ! -f $1 ]] && { echo -e "\tUsage:\t\n\t\t$0\t<input_file>\n"; exit 1; }

while read -ra line;
do
        if [[ ${line[@]} =~ [0-9]+:[0-9]+:[0-9]+ ]]; then
                echo ${line[@]}
                lasttime=${line[@]: -1:1}
        else

                echo ${line[@]} $lasttime
        fi
done < $1

相关内容