우리는 이 두 가지 기술을 사용하여 파일에서 원하는 행의 두 번째 열을 가져올 수 있다는 것을 알고 있습니다.
awk '/WORD/ { print $2 }' filename
또는
grep WORD filename| cut -f 2 -d ' '
내 질문은 다음과 같습니다
- 위의 두 명령의 차이점은 무엇입니까?
- 어느 것이 가장 좋은 성능을 가지고 있습니까?
awk
사용과 사용의 장점은 무엇이며cut
그 반대의 경우도 마찬가지입니까?awk
우리에게는 어떤 선택이 주어졌나요cut
? 그 반대도 마찬가지인가요?
답변1
두 라인 사이의 가장 중요한 차이점은 입력에 따라 다릅니다. 필드 구분 기호로 cut
단일 문자를 사용하고 (기본값은 TAB) 이 문자가 나타날 때마다 새 필드가 시작됩니다. 그러나 더 유연합니다. 구분 기호는 변수에 있으며 빈 문자열(각 입력 문자가 별도의 필드를 형성함), 단일 문자 또는 정규 표현식일 수 있습니다. 단일 공백 문자(기본값)의 특별한 경우는-d
awk
FS
주문하다공백. 또한 awk
선행 공백은 기본적으로 억제됩니다.
비교해주세요:
$ echo "abc def" | cut -f 2 -d ' '
def
$ echo "abc def" | cut -f 2 -d ' '
$ echo " abc def" | cut -f 2 -d ' '
abc
$ echo "abc def" | awk '{ print $2 }'
def
$ echo "abc def" | awk '{ print $2 }'
def
$ echo " abc def" | awk '{ print $2 }'
def
여기서는 awk
과 사이의 공백 순서를 기준으로 분할이 이루어지며, 각 공백은 구분 기호로 사용됩니다.abc
def
cut
당신이 취하는 것은 당신이 달성하고자 하는 것에 달려 있습니다. 그렇지 않으면 cut
더 작고 단일 목적의 도구이지만 awk
자체 프로그래밍 언어가 있기 때문에 더 빠르기를 바랍니다 .
답변2
일반적으로 도구가 전문화될수록 속도는 빨라집니다. 따라서 대부분의 경우 합계가 합계보다 빠르며 합계보다 빠르며 합계 cut
보다 빠르며 합계보다 빠르며 합계보다 빠릅니다 . 더 간단한 도구의 더 긴 파이프라인을 더 복잡한 도구의 단일 호출과 비교하는 경우 경험상 법칙이 없습니다. 이는 큰 입력(예: 수백만 행)에만 적합합니다. 짧은 입력의 경우 아무런 차이가 없습니다.grep
sed
sed
awk
더 복잡한 도구의 장점은 물론 더 많은 작업을 수행할 수 있다는 것입니다.
귀하의 명령은 불필요하게 cat을 사용합니다. 대신 리디렉션을 사용하십시오(특히 벤치마크를 실행하기 전에는 속도에 대해 걱정할 필요가 없지만 속도가 걱정되는 경우).
<fileName awk '/WORD/ { print $2 }'
<fileName grep WORD | cut -f 2 -d ' '
이러한 명령은 거의 동일합니다. 차이점은 다음과 같습니다.
- awk와 grep이 있습니다다양한 정규식 구문. awk와
grep -E
regexp는 거의 동일한 구문(확장 정규식)을 갖습니다. cut -d ' '
각 개별 공백 문자를 구분 기호로 처리합니다. awk의 기본 구분 기호는 여러 개의 공백, 탭 등이 될 수 있는 일련의 공백입니다. 임의의 공백 시퀀스를 구분 기호로 사용할 수 없습니다cut
. awk에서 단일 공백을 구분 기호로 사용하려면 단일 공백으로 구성된 정규 표현식이 아닌 단일 공백과 일치하는 정규 표현식으로 필드 구분 기호를 설정하십시오(이것은 "모든 공백 시퀀스"를 의미하는 특수한 경우입니다. 즉, 기본값):awk -F '[ ]' '/WORD/ {print $2}'
.
^ 프로그램 최적화의 첫 번째 규칙: 하지 마십시오. 프로그램 최적화의 두 번째 규칙(전문가만 해당!): 아직 수행하지 마십시오.—마이클 잭슨
답변3
주문,
cat fileName | awk '/WORD/ { print $2 }'
cat
주문 도 필요하지 않습니다 . 당신은 시도 할 수 있습니다,
awk '/WORD/ { print $2 }' filename
다음 명령은 출력을 cat에서 grep으로 리디렉션한 후 잘라냅니다.
cat fileName | grep WORD | cut -f 2 -d ' '
출력 리디렉션을 피해야 할 가능성이 높습니다. awk는 이 작업을 한 줄로 수행하지만 특정 단어가 포함된 줄만 가져오고 구분 기호 공간을 기반으로 열 2를 인쇄하는 명령이 cut
필요합니다 .grep
잘라내기가 실패하면 awk에서 이러한 작업을 수행할 수 있습니다.