동적 파일 이름을 생성하고 해당 파일에 대해 일부 작업을 수행하고 다른 디렉터리에 씁니다.

동적 파일 이름을 생성하고 해당 파일에 대해 일부 작업을 수행하고 다른 디렉터리에 씁니다.

다음과 같은 파일 이름을 가진 테스트 폴더가 있습니다.

100080_Accounting  Statistic-42005_04May2020_0000-04May2020_0100.csv  
110001_ABCD Traffic_04May2020_header_only.csv


cat '110001_ABCD Traffic_04May2020_header_only.csv'
ID,NAME,LOCATION
1,Vikrant,Gurgaon
2,Bharat,Noida
3,Raju,Hyderabad

cat '100080_Accounting Statistic-42005_04May2020_0000-04May2020_0100.csv'
ID,NAME,AGE,DEPARTMENT
4,Raju,22,Admin
5,Rajeev,23,Admin

테스트 디렉터리에서 특정 파일을 읽는 동안 파일 이름을 추출하고 파일의 각 레코드에 해당 파일 이름을 추가하려고 합니다. 새로 생성된 파일에 실제 레코드를 쓰기 전에 헤더에 새 열 이름 "GroupName"을 추가했으며 이 파일을 다른 디렉터리에 쓰고 싶습니다.

아래는 논리가 예상대로 잘 작동하는 쉘 스크립트이지만 동일한 파일 이름을 가진 다른 디렉토리에 쓰는 방법을 찾을 수 없습니다. 또한 두 번째 파일의 헤더에 열을 추가하는 데 문제가 있습니다.

#!/bin/bash

# Go to where the files are located
filedir=/home/vikrant_singh_rana/testing/*

#reading file from directory
for filename in $filedir; do
        #extracting modified file name from file
        b=$(basename "$filename" ".csv" | awk -F "_" '{print $2}' | awk -F "-" '{print $1}')
        #reading line by line from file
        first='yes'
        while read -r line;do
                #reading header from file
                header=$(head -n1 "$filename")
                if [[ $first == 'yes' ]]; then
                        #writing header with new column just once
                printf '%s,%s\n' "GroupName" "$header"
                first='no'
                else
                        #writing modified filename to each record of a file
                printf '%s,%s\n' "$b" "$line"
                fi
        done <"$filename"
        #echo $filename
        output_filename=$(basename "$filename")
        #echo $output_filename

#done
done > /home/vikrant_singh_rana/enrichment_files/enrichment_file.txt

내가 얻는 결과는 다음과 같습니다.

cat /home/vikrant_singh_rana/enrichment_files/enrichment_file.txt

GroupName,ID,NAME,AGE,DEPARTMENT
Accounting Statistic,4,Raju,22,Admin
Accounting Statistic,5,Rajeev,23,Admin
GroupName,ID,NAME,LOCATION
ABCD Traffic,1,Vikrant,Gurgaon
ABCD Traffic,2,Bharat,Noida
ABCD Traffic,3,Raju,Hyderabad

내가 기대하는 것은 다음과 같습니다. 파일 이름은 내가 읽고 있는 이름과 동일하며 출력은 별도의 파일에 기록되어야 합니다.

file name as :110001_ABCD Traffic_04May2020_header_only.csv

    GroupName,ID,NAME,AGE,DEPARTMENT
    Accounting Statistic,4,Raju,22,Admin
    Accounting Statistic,5,Rajeev,23,Admin

file name as :100080_Accounting  Statistic-42005_04May2020_0000-04May2020_0100.csv 
    GroupName,ID,NAME,LOCATION
    ABCD Traffic,1,Vikrant,Gurgaon
    ABCD Traffic,2,Bharat,Noida
    ABCD Traffic,3,Raju,Hyderabad

답변1

출력을 파일에 쓸 수 있었고 다음과 같이 변경했습니다. 변경 사항이 필요한 경우 수정해 주십시오.

#!/bin/bash

# Go to where the files are located
filedir=/home/vikrant_singh_rana/testing/*
#reading file from directory
for filename in $filedir; do
        #extracting modified file name from file
        b=$(basename "$filename" ".csv" | awk -F "_" '{print $2}' | awk -F "-" '{print $1}')
        #reading line by line from file
        first='yes'
        output_filename=$(basename "$filename")
        while read -r line;do
                #reading header from file
                header=$(head -n1 "$filename")
                if [[ $first == 'yes' ]]; then
                        #writing header with new column just once
                printf '%s,%s\n' "CounterGroupName" "$header" > /home/vikrant_singh_rana/enrichment_files/"$output_filename"
                first='no'
                else
                        #writing modified filename to each record of a file
                printf '%s,%s\n' "$b" "$line" >> /home/vikrant_singh_rana/enrichment_files/"$output_filename"
                fi
        done <"$filename"
done

관련 정보