각 파일에 열 수가 다른 여러 파일이 있습니다. 데이터베이스에 삽입하도록 변환하고 싶습니다.
예를 들어 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");
스크립트는 네 부분으로 구성됩니다.
-
s/^/("/
는 줄의 시작 부분을("
. -
s/\t/","/g
는 탭을","
로 바꿉니다. 이것은 GNUsed
가 필요한 비트입니다. 다른sed
구현의 경우\t
대신 리터럴 탭을 삽입합니다. -
s/$/"),/
는 줄 끝을"),
로 바꿉니다. -
$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";}"