어리석은 질문일지도 모르지만 저는 초보자입니다. 현재 csv 파일에서 필드를 추출하는 데 문제가 있습니다. 이상적으로는 li 태그와 괄호 안의 세 번째 열을 사용하여 인쇄하고 싶습니다. 내가 얻은 가장 가까운 것은
awk -F'\t' '{print "\"<li>$2($3)</li>\""}' OFS='","' datafile.csv
"<li>$2($3)</li>"
이로 인해 데이터를 추출하지 않고 중복 만 발생합니다 .
만을 사용하면 awk -F'\t' '{print "\<li>$2,($3)</li>\"}' OFS='","' datafile.csv
종료되지 않은 문자열 오류가 발생합니다.
내가 사용하는 경우:
awk '{print $1","$2","$4}' datafile.csv
공백 대신 쉼표로 거의 모든 것을 인쇄합니다.
내가 사용하는 경우:
awk '{print $2","$3"}' datafile.csv
나는 얻다:
awk: non-terminated string ,}... at source line 1
context is
{print >>> $2","$3"}
문제가 무엇인지 잘 모르겠습니다. 을 사용해 보기도 했습니다 cut
.
답변1
TSV 파일에서 탭으로 구분된 두 번째 및 세 번째 필드의 <li>$2($3)</li>
위치 $2
와 위치를 인쇄하려는 것 같습니다 .$3
다양한 방법으로 이 작업을 수행할 수 있지만 가장 확실한 두 가지 방법은 다음과 같습니다.
print "<li>" $2 "(" $3 ")</li>"
또는
printf "<li>%s(%s)</li>\n", $2, $3
두 변형 모두 따옴표 $2
또는 를 포함하지 않습니다 $3
. 그렇게 하면 참조하는 문자열이 아닌 $2
리터럴 문자열이 출력됩니다. $3
이것이 첫 번째 코드 부분의 문제입니다 awk
. 다른 사람들은 불균형한 견적으로 인해 어려움을 겪습니다.
문자열 주위에 큰따옴표를 넣으려면 다음을 사용하십시오.
print "\"<li>" $2 "(" $3 ")</li>\""
또는
printf "\"<li>%s(%s)</li>\"\n", $2, $3
답변2
아시다시피 awk는 $i
큰따옴표로 묶인 문자열 내부의 구문을 대체하지 않습니다.
echo foo bar baz | awk '{print "$1:$2"}'
$1:$2
awk는 단순히 문자열을 나란히 배치하여 문자열 연결을 수행합니다.
echo foo bar baz | awk '{print $1 ":" $2}'
foo:bar
설정했지만 OFS
활용하지 마십시오. 인쇄할 때 쉼표로 구분된 문자열 목록을 사용하여 연결합니다.OFS
echo foo bar baz | awk -v OFS=":" '{print $1, $2}'
foo:bar
답변3
\"
귀하의 문제는 귀하가 사용하는 것과 관련이 있는 것 같습니다 .
따옴표 붙은 문자열을 시작하면
"
다음(따옴표가 없는) 문자열로 이동합니다"
. 인용된 문자열에 삽입하면\"
인용된 문자열이 종료되지 않지만 "있는 그대로", 즉 큰따옴표 문자가 삽입됩니다.인용된 문자열 내에서는
$n
값이 확장되지 않습니다.
$ echo "one two three" | awk '{print "$2,$3"}'
$2,$3
$ echo "one two three" | awk '{print "\"$2,$3\""}'
"$2,$3"
$ echo "one two three" | awk '{print "\"",$2,$3,"\""}' # concatenated quotes
" two three "
$ echo "one two three" | awk '{print "\"" $2 $3 "\""}' # only one string
"twothree"
$ echo "one two three" | awk '{print "\""$2,$3"\""}' # two strings
"two three"
$ echo "one two three" | awk '{print "\""$2"\"","\""$3"\""}' # Using OFS
"two" "three"
$ echo "one two three" | awk -vOFS="," '{print "\""$2"\"","\""$3"\""}' # Changing OFS
"two","three"
\"
awk에서 문자열을 사용할 수 있는 방법은 다음과 같습니다.
따라서 아마도 다음을 원할 것입니다.
awk -F'\t' '{print "\"<li>" $2 "(" $3 ")</li>\""}' OFS='","' datafile.csv