2016-11-24 3 views
0

У меня есть 45 каталогов на моем диске с форматом именования Sub1, Sub2..Sub45 каждый состоит из более чем 300 текстовых файлов, все текстовые файлы в каждом каталоге имеют одинаковое имя форматBash script Отсортировать текстовые файлы в каталоге и экспортировать данные в csv

regional_vol_GM1.txt 
regional_vol_GM2.txt 
regional_vol_GM*.txt 

Я хотел бы сортировать каталоги и текстовые файлы в каждой директории в последовательном порядке и экспортировать данные в каждом файле в CSV-файл,

Ниже приведен сценарий, который я написал

eval "dirs=($(ls -v --quoting-style=shell-always))" 
for dir in "${dirs[@]}"; do 
    eval "files=($(
    ls -vd --quoting-style=shell-always -- "$dir"/t1/regional_vol*.txt))" 
    tail -q -n 1 -- "${files[@]}" | paste -sd , - 
done > data.csv 

Теперь я хотел бы перестроить мой выходной файл csv с именем файла текстового файла в качестве значения строки и имени каталога в качестве столбца, так как каждый каталог имеет 300 текстовых файлов с одинаковым форматом именования, мне просто нужна одна строка с именем файла как заголовок и имя каталога как столбец в файле csv

ответ

2

есть / в x и, таким образом, в вашем выражении. Изменить sed разделитель что-то не может произойти в x, как:

sed -i "1s#^#${x}\n#" ${x} 

и изменить «на месте», просто включите опцию -i (если не доступен в вашей системе, используйте временный файл и перемещение вернуться к исходному файлу)

Теперь для вашего файла вида: проблема заключается в том, что соответствие шаблона или даже ls сортирует файлы, но используя алфавитный порядок так regional_vol_GM2.txtприходит послеregional_vol_GM100.txt.

Таким образом, даже если это немного рубить вы могли бы заменить это:

tail -q -n 1 "$dir"/t1/regional_vol*.txt 

этим:

tail -q -n 1 (cd "$dir"/t1;ls -C1 regional_vol_GM*.txt | sort -k2 -tM -n) 

Почему это работает:

  • Я использую числовой режим sort, используя второе поле, разделенное M (цифры поступают после _GM).

Почему это хак:

  • полагается на выходе ls, который, как правило, с неодобрением. Вот это простой Ls на 1 колонку, без пробелов в именах, не должны быть в порядке
  • он должен выполнить cd только в случае, если есть M в пути каталога и то нашел бы неправильное поле

что вы должны сделать, чтобы просто исправить:

  • вы должны генерировать файлы/спросить у людей, которые делают это сделать с нулями: 1 становится 001, 2 002, становится и т.д. работает так, буквенно-цифровые сортировки нет необходимо сделать комплекс sort взломать.
+1

Команда sed также не может фактически изменить файл, может быть, адрес также? –

+0

Да, команда sed не работает, я все равно получаю неправильный вывод, вместо значений из каталога 1, я получаю значения из каталога 100 – DevanDevak

+0

@ Jean-FrançoisFabre, его работы, но есть проблема, так как у меня есть 45 каталогов , каталоги не сортируются последовательно. Извините за повторную настройку моего вопроса, мне нужно отсортировать как каталоги и файлы внутри каталогов, так и упорядочить их в последовательном порядке и экспортировать данные в каждый каталог в csv – DevanDevak

Смежные вопросы