쉘 스크립트는 입력 파일에서 부분 파일 이름을 가져와 출력 파일로 변환합니다.

쉘 스크립트는 입력 파일에서 부분 파일 이름을 가져와 출력 파일로 변환합니다.

소스 파일:

/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.

관련 정보