2016-06-27 8 views
2

광산에서 레코드를 행별로 구문 분석 (최대 요소 최대 개까지 반복 (최대 NF까지)) 한 솔루션에 awk을 사용하고 일부 필드를 bash 변수에 저장하고 싶습니다. 필자는 필요한 레코드를 얻을 수 있었지만 회피 할 수는 없었습니다 awk stdout에 자체 출력을 인쇄했습니다.awk가 표준 출력으로 출력을 억제하도록해야합니다.

이것은 내가 채택한 예입니다.

newvar=$(echo "Hello, this is a sentence with a few words." | awk '{ s = ""; for (i = 0; i <= 5; i++) s = s $i " "; print s }' 

나는 bash는 변수 newvar에 단어를 Hello, this is a sentence를 저장하고 싶었다. 더 효율적인 방법이 있지만, 잠시 동안 awk을 사용하는 방법을 고려하십시오.

$ newvar=$(echo "Hello, this is a sentence with a few words." | awk '{ s = ""; for (i = 0; i <= 5; i++) s = s $i " "; print s }' 1>&-) 

말하는 추한있어 오류 가변

Hello, this is a sentence with a few words. Hello, this is a sentence 

I뿐만 1>&-를 수행하여 nullstdout 억제 시도에서 아래와 같은 출력을 저장하고

awk : (FILENAME = -FNR = 1) 경고 : st 작성 중 오류 andard 출력 (잘못된 파일 설명자)

여기에서 괜찮은 답변을 찾을 수 없었으며이를 수행하는 방법도 알 수 없습니다. awk으로도 가능합니까? 발견 된 경우 정확한 게시물의 중복도 인정됩니다!

+0

왜 오류를 수정하는 대신 오류 메시지를 표시하지 :

이 방금 처음 5 개 단어를 인쇄 할 경우, cut을 사용했다되고? – Kusalananda

+2

줄 끝에서 닫는 괄호를 추가했다면 나에게 잘 작동하는 것 같습니다. 일치하는 줄에 단어가 0 인 경우 1 ~ 5 사이의 루프를 만들겠다고 상상합니다. – patthoyts

+0

@Kusalananda : 당신이 의미하는 것이 확실하지 않습니다! – Inian

답변

4

여기에서 문제는 0에서 5까지 반복한다는 것입니다. 즉, 변수 s$0을 저장하고 있습니다. 알고 계시 겠지만 $0에는 전체 레코드가 들어 있습니다. 즉, 전체 레코드 뒤에 5 개의 첫 번째 필드를 저장하는 것입니다. 1 ~ 5에서

그러니 그냥 루프 : 처음에 ""s을 설정할 필요가 없습니다하는 방식으로

$ awk '{s = ""; for (i = 1; i <= 5; i++) s = s $i " "; print s }' <<< "Hello, this is a sentence with a few words." 
Hello, this is a sentence 

참고 : 어떤 변수는 당신이 그것을 사용하여 시작할 때 설정할 수 없습니다. 여러 행을 가지고 있으므로 모든 레코드가 끝날 때마다 값을 다시 설정해야하므로이 값을 사용할 수도 있습니다.

$ cut -d' ' -f-5 <<< "Hello, this is a sentence with a few words."Hello, this is a sentence 
+1

그건 정말 기본적인 것이 었습니다! 그것을 받아 들인다! 더 이상 효과적인 답변을 적용 할 수 없습니다! – Inian

관련 문제