Я действительно надеюсь, что могу объяснить свою проблему. Ваша справка будет очень цениться.
У меня есть более чем 1 000 файлов CSV, который смотрит точно то же. Пример
Malian Aero Company,,,,,Aircraft,TZ-DDG,(Seed 1),,,Block-on (Z),18:19, Landing (Z),,18:14,Date,06/06/16
2016 MALI WEATHER MODIFICATION PROGRAM,,,,,,,,,,Block-off (Z),16:35, Takeoff (Z),,16:41,Page,1
,Pilot:,Daniel Chacon,,Co-Pilot:,Malik,,Observer: ,,,Total Time,01:44, Flight Time ,,01:33,Type,Seed
,,,,,,,,,,,,,,,,
Time,Cell,Event,LAT,LON,Alt.,Ejectable (Glacio),,BIP (Hygro),,Remarks,,,,,,
(UTC),No.,No.,(VOR),(DME),(Kft),0,Recycle,Burn,Recycle,,,,,,,
17:03,1,,12.55,-9.03,"8,000",,,1,,,,,,,,
17:06,,,12.67,-9.13,"8,000",,,1,,Updraft 500/900 ft/m,,,,,,
17:11,,,12.56,-9.11,"8,000",,,1,,,,,,,,
17:13,,,12.74,-9.07,"8,000",,,1,,,,,,,,
17:35,2,,13.31,-9.07,"9,000",,,1,,,,,,,,
17:39,,,13.53,-9.05,"9,000",,,1,,,,,,,,
Проблема, я хочу, чтобы название файла CSV было датой, что полет произошел, который в гармонии 2. В этом примере дата 06/06/16
. Поэтому я хочу, чтобы название файла CSV было 20160606
. Обратите внимание на изменения в порядке, который, вероятно, делает их немного более сбивающими с толку.
Как я могу сделать это автоматически?
Этот сценарий имеет два аргумента. Один для каталога для Ваших файлов CSV. Другой для новых файлов исправлен.
В случае, если у Вас есть больше чем один полет в тот же день, я добавил время как часть имени файла, чтобы гарантировать, что существует уникальное имя для каждого outfile.
Сценарий:
#!/bin/bash
indir=$HOME/indir
outdir=$HOME/outdir
[[ -d $outdir ]] || (echo "Outdir doesn't exist... Exiting..." ; exit)
process() {
file=$1
datetime=$(head -1 $file|awk -F, '{print $NF"/"$(NF-2)}' | sed s#/#:#g)
IFS=':' read -r -a arr <<< "$datetime"
newname=$(printf "20${arr[2]}${arr[0]}${arr[1]}-${arr[3]}${arr[4]}.csv\n")
echo "Name Change: $file -> $newname"
sed -e '1,7d' < $file > $outdir/$newname
}
for i in "$indir"/*.csv; do
process "$i"
done
Сводка сценария
Переменные и команды сценария:
Вы могли использовать cut
для выбора точного столбца, в котором Вы нуждаетесь, затем Вы могли использовать date
(, например , в сочетании с sed) для установки имени файла.
Помещенный это в цикл для прохождения через всех файлов и Вы сделаны.
Для помощи Вам на пути:
cut --delim="," -f17 yourfile.csv | head -n1
Это выберет дату, теперь это - Ваша очередь преобразовать его.
Это, вероятно, собирается сделать Ребенка Jesus (или по крайней мере, Larry Wall) криком, но:
prename -n '
use Text::CSV;
use Time::Piece;
open my $fh, "<", $_ or die "$_ : $!";
eval {
my $r = Text::CSV->new()->getline($fh);
s{.*(?=\.csv)}{Time::Piece->strptime($r->[-1], "%d/%m/%y")->strftime("%Y%m%d")}e if ($r);
1;
}
or do {
print "$_ skipped (no valid date field found)\n"
}
' *.csv
file1.csv renamed as 20160606.csv
file2.csv renamed as 20160623.csv
file3.csv skipped (no valid date field found)
file.csv : Permission denied at (eval 8) line 4.
Примечание:
"%d/%m/%y"
но пример, который Вы дали, мог быть считан как "%m/%d/%y"
- необходимо будет проверить и корректироваться при необходимостиЭто должно пропустить файлы, из которых это не может проанализировать допустимую дату в ожидаемом месте: обработка ошибок для парсинга даты взята от Обработки исключений в Perl: Как иметь дело с фатальными ошибками во внешних модулях.
Удалите -n
только, если/когда Вы убеждены, что это делает правильную вещь.