Сценарий оболочки для извлечения части имени файла из входного файла и преобразования его в выходной файл

Исходный файл:

/path/to file/A_B_C_D_201507290915.csv 

Destination_File должен выглядеть следующим образом:

 /some/other/path/to file/A_B_C_D_201507290915.csv 

Мне нужно преобразовать Source_FIle и сохранить одноименное имя в другом месте.

Преобразование похоже на преобразование всех строк csv в столбец. КОД:

 #!/bin/bash var=`echo A_B_C_D_*.csv | grep -oP '(?<=_)\d+(?=\.)'` awk -F, '{for(i=1;i<=NF;i++){A[NR,i]=$i};if(NF>n){n=NF}} END{for(i=1;i<=n;i++){ for(j=1;j<=NR;j++){ s=s?s","A[j,i]:A[j,i]} print s;s=""}}' A_B_C_D_*.csv > /some/other/path/to file/A_B_C_D_$var.csv 

Он отлично работает для одного файла, но в случае нескольких исходных файлов он дает неоднозначную ошибку перенаправления.

Проблема заключается в вашей переменной var . Если вы хотите придерживаться этого, скорее назначьте его массиву.

Код:

 #!/bin/bash var=`echo A_B_C_D_*.csv | grep -oP '(?<=_)\d+(?=\.)'` arr=($var) for i in "${arr[@]}" do awk -F, '{for(i=1;i<=NF;i++){A[NR,i]=$i};if(NF>n){n=NF}} END{for(i=1;i<=n;i++){ for(j=1;j<=NR;j++){ s=s?s","A[j,i]:A[j,i]} print s;s=""}}' A_B_C_D_$i.csv > /some/path_to/dest/A_B_C_D_$i.csv done 

Вы можете использовать переменную имени файла в awk

Не уверен, что вы устанавливаете var, поэтому я оставлю это

 awk -F, '{ for(i=1;i<=NF;i++)A[NR,i]=$i if(NF>n)n=NF } ENDFILE{ sub(/.*\//,"",FILENAME) for(i=1;i<=n;i++){ for(j=1;j<=NR;j++){ s=s?s","A[j,i]:A[j,i] } print s > "NEWPATH" FILENAME;s="" } }' A_B_C_D_*.csv к awk -F, '{ for(i=1;i<=NF;i++)A[NR,i]=$i if(NF>n)n=NF } ENDFILE{ sub(/.*\//,"",FILENAME) for(i=1;i<=n;i++){ for(j=1;j<=NR;j++){ s=s?s","A[j,i]:A[j,i] } print s > "NEWPATH" FILENAME;s="" } }' A_B_C_D_*.csv 

Используйте basename , часть coreutils .

Использование bash :

 for i in $(<file_with_source_file_names) do mv $i /some/other/path/to\ file/$(basename $i) done 

Или вы можете использовать cp вместо mv . Твой выбор.