我有這種格式的時間戳:
(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
或者是否有更簡單的方法來檢測行的變化和具有不同行的單獨檔案?感謝您的任何建議:)
uj5u.com熱心網友回復:
假設您的“普通”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:)
uj5u.com熱心網友回復:
所以,一個“普通”檔案只包含兩行不同的行:
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
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/341201.html
