awk는 csv 파일에서 필드를 추출할 수 없습니다.

awk는 csv 파일에서 필드를 추출할 수 없습니다.

어리석은 질문일지도 모르지만 저는 초보자입니다. 현재 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

\"귀하의 문제는 귀하가 사용하는 것과 관련이 있는 것 같습니다 .

  1. 따옴표 붙은 문자열을 시작하면 "다음(따옴표가 없는) 문자열로 이동합니다 ". 인용된 문자열에 삽입하면 \"인용된 문자열이 종료되지 않지만 "있는 그대로", 즉 큰따옴표 문자가 삽입됩니다.

  2. 인용된 문자열 내에서는 $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

관련 정보