NF 및 for 루프를 사용하여 스크립트를 최적화하는 방법

각 파일에 열 수가 다른 여러 파일이 있습니다. 데이터베이스에 삽입하도록 변환하고 싶습니다.

예를 들어 test01 파일 :

0001 000000000000001 john smith 45 500 0002 000000000000002 peter jackson 20 80 0003 000000000000002 robert brown 35 100 0004 000000000000007 sarah white 40 300 

원하는 출력은 다음과 같습니다.

p>

("0001","000000000000001","john smith","45","500"), ("0002","000000000000002","peter jackson","20","80"), ("0003","000000000000002","robert brown","35","100"), ("0004","000000000000007","sarah white","40","300"); 

이 작업을 수행하기 위해 다음 스크립트를 사용합니다.

cat test01 |awk -F"\t" "{print "("\"""$1""\"","\"""$2""\"","\"""$3""\"","\"""$4""\"","\"""$5""\""),"}" |sed "$ s/.$/;/" 

그리고 잘 작동합니다. 문제는 열 수가 다른 다른 파일을 찾을 때입니다. 따라서 스크립트를 수동으로 수정해야합니다.

AWK의 변수 NF를 사용하여 열 수를 얻을 수 있다는 것을 알고 있습니다. 스크립트에서이 변수를 for 루프와 결합하려면?

시도 할 때

cat test01 | awk "{for (i = 1; i <= NF; i++){print $i""\"","\"""}}" 

다음 결과를 얻습니다.

0001"," 000000000000001"," john"," smith"," 45"," 500"," 0002"," 000000000000002"," peter"," jackson"," 20"," 80"," 0003"," 000000000000002"," robert"," brown"," 35"," 100"," 0004"," 000000000000007"," sarah"," white"," 40"," 300"," 

댓글

  • 원본 파일에 탭 구분 기호가 있습니까 아니면 그냥 " 일부 공백 "?
  • 탭 구분 기호입니다.

답변

GNU 사용 sed :

$ sed -e "s/^/("/" -e "s/\t/","/g" -e "s/$/"),/" -e "$s/.$/;/" file ("0001","000000000000001","john smith","45","500"), ("0002","000000000000002","peter jackson","20","80"), ("0003","000000000000002","robert brown","35","100"), ("0004","000000000000007","sarah white","40","300"); 

스크립트는 네 부분으로 구성됩니다.

  1. s/^/("/는 줄의 시작 부분을 (".
  2. s/\t/","/g는 탭을 ","로 바꿉니다. 이것은 GNU sed가 필요한 비트입니다. 다른 sed 구현의 경우 \t 대신 리터럴 탭을 삽입합니다.
  3. s/$/"),/는 줄 끝을 "),로 바꿉니다.
  4. $s/.$/;/는 줄 끝의 쉼표를 바꿉니다. 마지막 줄 (만) ;.

댓글

  • 스크립트를 실행합니다. 그리고 " > "가 무언가를 기대하고 있다는 메시지를 표시합니다.
  • @ user3333911 이전 버전에서 따옴표가 일치하지 않습니다. 지금 수정되고 테스트되었습니다.

답변

입력 파일이 탭으로 구분 된 경우 다음을 시도 할 수 있습니다.

awk -F"\t" -vq=""" -vOFS="","" "$1=$1 {print "(" q $0 q ");"}" filename 

또는 인쇄 기능에 따옴표 삽입 :

awk -F"\t" -vOFS="","" "$1=$1 {print "(" "\x27" $0 "\x27" ");"}" filename 

댓글

  • 마지막 줄을 제외한 모든 줄의 끝에있는 쉼표를 확인하세요 …
  • @Kusalananda에서 좋은 소식입니다. awk -F"\t" -vq="'" -vOFS="','" '$1=$1 {print "(" q $0 q "),"}' filename | sed '$s/,$/;/'에서와 같이 빠른 수정을했습니다. 더 나은 제안이 있으신가요?
  • 아니요. ' 좋은 해결책입니다.

답변

초기 스크립트에서 원하는 것과 동일한 동작을 수행하려면 awk의 “printf”메소드를 사용할 수 있습니다. “인쇄”에 의해 삽입 된 개행 문자를 제거 할 수 있습니다. 스크립트는 다음과 같이 다시 작성해야합니다.

cat test01 | awk "{for (i = 1; i <= NF; i++){printf $i""\"","\"""}; printf "\n";}" 

답글 남기기

이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다