그래서 데이터를 다른 형식으로 구문 분석해 보았지만 데이터의 마지막 열에 구분 기호가 포함되어 있습니다.
내가 사용하는 경우:
awk -F: {' print $1 "\t" $2 "\t" $3 '}
데이터는 다음과 같습니다
ExampleCol1:ExampleCol2:Ex:am:ple:Col3
나는 단지 다음을 얻습니다:
ExampleCol1 ExampleCol2 Ex
그 후에 나머지 열을 어떻게 잡을 수 있습니까 $2
? 그래서 이렇게 :
print $1 "\t" $2 "\t" $(REST OF COLUMNS)
답변1
귀하의 질문을 올바르게 이해했다면 이것이 귀하에게 도움이 될까요?
sed -e 's/:/\t/1' -e 's/:/\t/1' yourFile
처음 두 개의 콜론을 탭으로 바꾸고 나머지를 인쇄합니다.
샘플 데이터를 기반으로 출력은 다음과 같습니다.
ExampleCol1 ExampleCol2 Ex:am:ple:Col3
귀하의 질문에 귀하가 있다고 말했기 때문에 잘 모르겠습니다.
ExampleCol1:ExampleCol2:Ex
제공한 awk 명령을 실행하면 다음과 같은 결과가 나타납니다.
ExampleCol1 ExampleCol2 Ex
답변2
_example='ExampleCol1:ExampleCol2:Ex:am:ple:Col3'
awk -F: '{printf $1 "\t" $2 "\t"} {for(i=3;i<=NF;i++) printf $i "\t"} {print ""}' <<<"${_example}"
...조금 지저분해 보이지만 출력은 됩니다...
ExampleCol1 ExampleCol2 Ex am ple Col3
...원하는 것을 표현하는 더 간결한 방법이 있을 것입니다 awk
. 예를 들어...
awk -F: '{for(i=1;i<=NF;i++) printf $i "\t"} {print ""}' <<<"$_example"
...하지만 위의 방법을 사용하면 원하는 동작에 더 가까워질 수 있습니다.awk
고쳐 쓰다
아, 그렇다면 두 번째 열 뒤에 콜론이 있어야 할 것 같은데요...
awk -F: '{printf $1 "\t" $2 "\t"} {for(i=3;i<NF;i++) printf $i ":"} {print $NF}' <<<"$_example"
awk
...이 질문에 다음과 같이 대답하는 것이 더 정확할 수도 있습니다...
ExampleCol1 ExampleCol2 Ex:am:ple:Col3
답변3
한 가지 방법은 다음과 같습니다.
$ awk -vOFS="\t" '{
sub(/:/, OFS)
sub(/:/, OFS)
}1' inp
또는 다른 방법으로:
$ awk '! /:.*:/ || sub(/:/, "\t") && sub(/:/, "\t")' inp
답변4
다음 명령을 사용해보십시오. 훌륭하게 작동합니다.
주문하다
sed "s/:/ /3g" filename| awk -F ":" '{print $1,$2,$3}'| sed "s/ /:/3g"| awk 'OFS="\t" {print $1,$2,$3}'
산출
ExampleCol1 ExampleCol2 Ex:am:ple:Col3