abc.dat
아래와 같이 첫 번째 레코드가 포함된 파일 이름이 있습니다.01|06/30/2020|test.txt.
- 파일의 나머지 부분에는 다음과 같은 레코드가 포함되어 있습니다.
123456|Alpha|....... 134567|Beta|.... ................
- 이제 파일에서
06/30/2020
첫 번째 레코드를 가져와MMDDYYYY
비슷한 형식 으로 변환06302020
하고 첫 번째 레코드를 제외한 파일의 첫 번째 열로 만들어야 합니다. - 출력: 예상 출력은 다음과 같습니다.
01|06/30/2020|test.txt 06302020|123456|Alpha|.......... 06302020|134567|Beta|........... ................................
- 다음 코드를 사용해 보았습니다.
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()
두 번째 필드(날짜 포함)의 복사본을 만듭니다 ./
- 모든 후속 라인에서 이 수정된 사본은 원래 라인 내용 앞에 추가됩니다.