파일의 날짜를 파일의 첫 번째 열로 채우는 Unix 쉘 스크립트

파일의 날짜를 파일의 첫 번째 열로 채우는 Unix 쉘 스크립트
  1. abc.dat아래와 같이 첫 번째 레코드가 포함된 파일 이름이 있습니다.
    01|06/30/2020|test.txt. 
    
  2. 파일의 나머지 부분에는 다음과 같은 레코드가 포함되어 있습니다.
    123456|Alpha|....... 
    134567|Beta|.... 
    ................
    
  3. 이제 파일에서 06/30/2020첫 번째 레코드를 가져와 MMDDYYYY비슷한 형식 으로 변환 06302020하고 첫 번째 레코드를 제외한 파일의 첫 번째 열로 만들어야 합니다.
  4. 출력: 예상 출력은 다음과 같습니다.
    01|06/30/2020|test.txt 
    06302020|123456|Alpha|..........
    06302020|134567|Beta|...........
    ................................
    
  5. 다음 코드를 사용해 보았습니다.
    for file in `ls abc.dat`
    do
        #Gets filename for each row
        # echo "file = $file"
        rec=`wc -l $file`
        rec_cnt=`echo $rec | cut -f1 -d" "`
        #echo "Record Count = $rec_cnt"
        #extract the month end date from the first line from file
        month_end_date=`head -1 $file|tr -d '/'|cut -f2 -d"|"`
        #echo "month end date is $month_end_date"
        awk -F"|" '{if(NR == 1) printf ("%s\n",$0)
            else{ if ('$month_end_date' == $1) printf("%s\n",$0)
                else printf ("%s|%s\n",'$month_end_date',$0)} }'
    done
    

답변1

awk기본적으로 여러 파일을 명령줄 인수로 처리할 수 있으므로 쉘 루프에서 호출할 필요가 거의 없습니다 . 게다가 루프콘텐츠파일을 읽고 개별 줄을 전달하는 것은 매우 비효율적이므로 권장되지 않습니다.

실제로 전체 기능은 awk프로그램으로 구현될 수 있습니다.

awk '
    BEGIN {OFS=FS="|"}
    FNR==1 {d=gensub("/","","g",$2); print;}
    FNR>1 {print d,$0}
' abc.dat

설명하다:

  • 각 파일의 첫 번째 줄에서 함수를 사용하여 모든 필드가 빈 문자열로 대체(즉, 제거됨)된 gensub()두 번째 필드(날짜 포함)의 복사본을 만듭니다 ./
  • 모든 후속 라인에서 이 수정된 사본은 원래 라인 내용 앞에 추가됩니다.

관련 정보