[英]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.