파이프 없이 두 명령 결합(awk 및 sed)

파이프 없이 두 명령 결합(awk 및 sed)

awk와 sed를 사용하는 명령이 있습니다.

awk '{$1=""; print $0}' file.txt | sed "1s/.*/D,,3/" #awk command removes first column from file.txt and prints the rest, sed inserts "D,,3" on the first line

위 명령으로 원하는 결과를 얻었습니다. 하지만 파이프 사용을 피하려고 하는데, 위의 두 명령을 결합하여 파이프를 사용하지 않고 동일한 결과를 얻을 수 있는 방법이 있습니까?

first : awk '{$1=""; print $0}' file.txt
second: sed "1s/.*/D,,3/"

file.txt:
row 3:
name      john doe
state     Florida
age       32

답변1

awk와 sed는 모두튜링 완료, 따라서 한 사람이 할 수 있는 것은 무엇이든 다른 사람도 할 수 있습니다. (텍스트 변환에 관한 한 awk는 운영 체제 상호 작용을 위한 더 많은 기능을 제공합니다.) 그러나 각각에는 고유한 장점과 단점이 있습니다. awk는 sed가 수행하는 대부분의 작업을 쉽게 수행할 수 있지만 정규 표현식을 그룹으로 바꾸는 것과 같은 일부 작업은 더 어렵습니다. 이론적으로 sed는 awk가 할 수 있는 모든 작업을 수행할 수 있지만 상당한 어려움이 따릅니다(예: sed에는 정수 연산 기능이 없으므로 텍스트 변환을 사용하여 인코딩해야 합니다). 따라서 모든 것을 하나의 명령에 넣으려면 일반적으로 awk가 최선의 선택입니다.

awk 'NR==1 {print "D,,3"; next} {$1=""; print $0}' file.txt

여기서 sed는 awk로 했던 작업을 쉽게 수행할 수도 있습니다. 공백을 정규화하고 모든 것을 첫 번째 공백으로 잘라냅니다.

sed "s/[ \t][ \t]*/ /g; s/^ *[^ ][^ ]*/ /; s/^ $//; 1s/.*/D,,3/" file.txt

여기서는 두 명령을 결합하는 것이 특별히 유용하지 않습니다. 성능 향상은 기대하지 않습니다. 데이터가 한 명령에서 다음 명령으로 이동해야 하기 때문에 각 파이프라인에는 성능 저하가 있습니다. 그러나 성능이 향상될 수도 있습니다. CPU가 여러 개인 경우 두 명령을 병렬로 실행할 수 있습니다. 어떤 것에 대해 좀 더 전문적인 명령을 사용하는 경우(예를 들어 awk와 같은 범용 도구 대신에 같은 특수 도구를 사용하는 경우 grep) head일반적으로 게인이 파이프라인의 오버헤드를 보상하는지 여부에 따라 더 빠릅니다. 데이터, 도구, 보유한 코어 수 등에 대해

이 스크립트가 성능 병목 현상이 아닌 한 먼저 명확성을 고려하십시오. 이 경우에는 순수한 sed 버전을 사용하지 않을 것입니다. 약간 더 빠르지만 읽기가 훨씬 어려울 수 있습니다. (예를 들어 항상 두 개 이상의 필드가 있고 필드 구분 기호가 항상 단일 공백이라는 것을 알고 있거나 공백 수를 유지하는 데 신경 쓰지 않는 경우 데이터에 대한 특정 가정에 따라 단순화될 수 있습니다.) awk에서는 모든 것이 더 깔끔하게 수행되지만 awk+sed 버전과 밀접한 관계가 있습니다.

관련 정보