Я очень надеюсь, что смогу объяснить свою проблему. Ваша помощь будет высоко оценена.
У меня более 1000 файлов 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
Сценарий:
Переменные и команды скрипта:
indir : Сценарий с использованием переменных indir для каталога ваших файлов csv. oudir: Создайте этот каталог для новых файлов, которые нужно скопировать. Первая строка: проверяет наличие существующего каталога перед продолжением сценария. arr: переменная массива для разделения даты и создания нового имени файла. sed: текстовый редактор командной строки, используемый для удаления нежелательных строк.Этот скрипт имеет два аргумента. Один для каталога для ваших файлов 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
Сценарий:
Переменные и команды скрипта:
indir : Сценарий с использованием переменных indir для каталога ваших файлов csv. oudir: Создайте этот каталог для новых файлов, которые нужно скопировать. Первая строка: проверяет наличие существующего каталога перед продолжением сценария. arr: переменная массива для разделения даты и создания нового имени файла. sed: текстовый редактор командной строки, используемый для удаления нежелательных строк.Этот скрипт имеет два аргумента. Один для каталога для ваших файлов 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
Сценарий:
Переменные и команды скрипта:
indir : Сценарий с использованием переменных indir для каталога ваших файлов csv. oudir: Создайте этот каталог для новых файлов, которые нужно скопировать. Первая строка: проверяет наличие существующего каталога перед продолжением сценария. arr: переменная массива для разделения даты и создания нового имени файла. sed: текстовый редактор командной строки, используемый для удаления нежелательных строк.Возможно, это заставит ребёнка Иисуса (или, по крайней мере, Ларри Уолл) кричать, но:
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" - вам нужно будет проверить и при необходимости отрегулироватьIt должен пропускать файлы, из которых он не может проанализировать допустимую дату в ожидаемом месте: обработка ошибок для синтаксиса даты берется из обработки исключений в Perl: как бороться с фатальными ошибками во внешних модулях.
Удалите -n только в том случае, если / если вы уверены, что поступаете правильно.
Вы можете использовать cut для выбора точного столбца, который вам нужен, тогда вы можете использовать date (например, в сочетании с sed), чтобы установить имя файла.
Поместите это в цикл
Чтобы помочь вам в пути:
cut --delim="," -f17 yourfile.csv | head -n1
Это позволит выбрать дату, теперь ваша очередь превратить ее.
Вы можете использовать cut для выбора точного столбца, который вам нужен, тогда вы можете использовать date (например, в сочетании с sed), чтобы установить имя файла.
Поместите это в цикл
Чтобы помочь вам в пути:
cut --delim="," -f17 yourfile.csv | head -n1
Это позволит выбрать дату, теперь ваша очередь превратить ее.
Возможно, это заставит ребёнка Иисуса (или, по крайней мере, Ларри Уолл) кричать, но:
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" - вам нужно будет проверить и при необходимости отрегулироватьIt должен пропускать файлы, из которых он не может проанализировать допустимую дату в ожидаемом месте: обработка ошибок для синтаксиса даты берется из обработки исключений в Perl: как бороться с фатальными ошибками во внешних модулях.
Удалите -n только в том случае, если / если вы уверены, что поступаете правильно.
Вы можете использовать cut для выбора точного столбца, который вам нужен, тогда вы можете использовать date (например, в сочетании с sed), чтобы установить имя файла.
Поместите это в цикл
Чтобы помочь вам в пути:
cut --delim="," -f17 yourfile.csv | head -n1
Это позволит выбрать дату, теперь ваша очередь превратить ее.
Возможно, это заставит ребёнка Иисуса (или, по крайней мере, Ларри Уолл) кричать, но:
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" - вам нужно будет проверить и при необходимости отрегулироватьIt должен пропускать файлы, из которых он не может проанализировать допустимую дату в ожидаемом месте: обработка ошибок для синтаксиса даты берется из обработки исключений в Perl: как бороться с фатальными ошибками во внешних модулях.
Удалите -n только в том случае, если / если вы уверены, что поступаете правильно.