csv에서 cli를 통해 반복된 범위의 인수를 인쇄할 수 있습니까? (예제 참조)

csv에서 cli를 통해 반복된 범위의 인수를 인쇄할 수 있습니까? (예제 참조)

수천 개의 VM에 수백 개의 로그가 분산되어 있고 로그를 빠르게 스캔하기 위해 몇 가지 스크립트를 생성하려고 하며 프레젠테이션의 대부분을 파악했으며 awk와 같은 것을 사용하는 쉬운 방법이 있는지 알고 싶었습니다. printf 등을 사용하는 방법을 알고 있지만 특히 로그 파일에서 반복된 값 범위를 인쇄하는 방법은 무엇입니까?

예:

awk -F, '{printf $(1..5)}' huge_log_file.csv
column1 column2 column3 column4 column5
etc.

나는 인쇄된 출력을 적절하게 awk, 형식 지정, 분리하는 방법을 알고 있지만 인쇄하려는 필드 범위를 지정할 수 있다면 좋을 것이라고 생각했습니다.

제안된 유사한 질문 및/또는 스스로 수행하는 방법을 찾으면 내 질문을 업데이트하겠습니다.

감사해요!

편집: $1 $2 $3 수동으로 인쇄하는 방법을 알고 있지만 내 예에는 포함하지 않았습니다.

편집 2: 또한 장기적인 목표인 범위를 나중에 동적으로 만들기 위해 NF를 사용하여 awk로 필드 수를 계산하는 방법도 알고 있습니다.

답변1

첫 번째 필드로 시작하는 범위

이 테스트 파일을 고려해 보겠습니다.

$ cat input.csv
a,b,c,d,e,f,g,h,i,j

최소한 GNU awk를 사용하면 다음과 같이 처음 5개(또는 다른 개수) 필드를 인쇄할 수 있습니다.

$ awk -F, '{NF=5; print}' OFS=, input.csv
a,b,c,d,e

명확성보다 간결성을 중시하는 사람들을 위해 다음과 같이 작성할 수 있습니다.

$ awk -F, '{NF=5;} 1' OFS=, input.csv
a,b,c,d,e

동적 크기 조정

두 필드 앞에 있는 필드 수에 관계없이 마지막 2개 필드를 생략하려면 다음을 수행하세요.

$ awk -F, '{NF-=2; print}' OFS=, input.csv
a,b,c,d,e,f,g,h

기타 범위

임의의 필드로 시작 및 중지를 인쇄하려면 루프가 필요합니다.

$ awk -v first=3 -v last=6 -F, '{for (i=first;i<=last;i++) printf "%s%s",$i,(i==last?ORS:OFS)}' OFS=, input.csv
c,d,e,f

세 번째 필드에서 인쇄하고 마지막 두 필드를 동적으로 제외하려면 다음을 수행하십시오.

$ awk -v first=3 -F, '{last=NF-2; for (i=first;i<=last;i++) printf "%s%s",$i,(i==last?ORS:OFS)}' OFS=, input.csv
c,d,e,f,g,h

답변2

간단히 말해서; awk훨씬 더 유연하지만 원하는 것이 특정 필드 범위뿐이라면 다음을 사용하십시오 cut.

cut -d, -f1-5 huge_log_file.csv

awk이것이 필요한 전부라면 루프 보다 훨씬 간단합니다 .

관련 정보