繁体   English   中英

bash/awk/unix 检测 csv 文件行的变化

[英]bash/awk/unix detect changes in lines of csv files

我有这种格式的时间戳:

(normal_file.csv)

timestamp
19/02/2002
19/02/2002
19/02/2002
19/02/2002
19/02/2002
19/02/2002

日期通常是统一的,但是,有些文件具有不规则的日期模式,例如此示例:

(异常文件.csv)

timestamp
19/02/2002
19/02/2003
19/02/2005
19/02/2006

在我的目录中,有数百个由 normal.csv 和异常.csv 组成的文件。

我想编写一个 bash 或 awk 脚本来检测目录的所有文件中的日期模式。 带有异常 .csv 的文件应该自动移动到一个新的、单独的目录(假设 dir_different/)。

目前,我尝试了以下方法:

#!/bin/bash

mkdir dir_different

for FILE in *.csv;

do
  # pipe 1: detect the changes in the line
  # pipe 2: print the timestamp column (first column, columns are comma-separated)
  awk '$1 != prev {print ; prev = $1}' < $FILE | awk -F , '{print $1}'
done

如果给定文件中的时间戳是正常的,那么只会打印一个时间戳; 但对于异常文件,将打印多个日期。

我不确定如何将异常文件与正常文件分开,我尝试了以下方法:

do
   output=$(awk 'FNR==3{print $0}' $FILE)
   echo ${output}

   if [[ ${output} =~ ([[:space:]]) ]]
   then
      mv $FILE dir_different/
   fi
done

或者是否有更简单的方法来检测行的变化和具有不同行的单独文件? 谢谢你的任何建议:)

假设您的“普通”CSV 文件都没有尾随换行符,这应该可以很好地进行分离:

#!/bin/bash
mkdir -p dir_different

for FILE in *.csv;
do
        if awk '{a[$1]++}END{if(length(a)<=2){exit 1}}' "$FILE" ; then
                echo mv "$FILE" dir_different
        fi
done

干运行后,只需摆脱echo :)

所以,一个“普通”文件只包含两行不同的行:

timestamp
dd/mm/yyyy

因此,测试文件是否正常非常简单:

[ $(sort -u file.csv | wc -l) -eq 2 ]

这导致以下可能的解决方案:

#!/usr/bin/env bash
mkdir -p dir_different

for FILE in *.csv;
do
        if [ $(sort -u "$FILE" | wc -l) -ne 2 ] ; then
                echo mv "$FILE" dir_different
        fi
done

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM