Shell 脚本从输入文件中获取部分文件名并将其转换为输出文件

Shell 脚本从输入文件中获取部分文件名并将其转换为输出文件

源文件:

/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

它对于一个文件工作正常,但在多个源文件的情况下,它会给出不明确的重定向错误。

答案1

问题出在你的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

答案2

您可以在 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

答案3

使用basename,部分coreutils

使用bash

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

或者你可以使用cp代替mv.你的选择。

相关内容