awk에서 탭으로 구분 된 값


91

TAB으로 구분 된 문자열에서 첫 번째 열을 어떻게 선택합니까?

# echo "LOAD_SETTLED    LOAD_INIT       2011-01-13 03:50:01" | awk -F'\t' '{print $1}'

위는 예상대로 "LOAD_SETTLED"뿐만 아니라 전체 라인을 반환합니다.

최신 정보:

탭으로 구분 된 값의 세 번째 열을 변경해야합니다. 다음은 작동하지 않습니다.

echo $line | awk 'BEGIN { -v var="$mycol_new" FS = "[ \t]+" } ; { print $1 $2 var $4 $5 $6 $7 $8 $9 }' >> /pdump/temp.txt

그러나 구분 기호가 탭 대신 쉼표 인 경우 예상대로 작동합니다.

echo $line | awk -v var="$mycol_new" -F'\t' '{print $1 "," $2 "," var "," $4 "," $5 "," $6 "," $7 "," $8 "," $9 "}' >> /pdump/temp.txt

4
awk 'BEGIN {FS = "[\ t] +"}; {print $ 1} '# 이것이 제가 찾던 것입니다. 내 Google 검색이 정확합니까? :)
shantanuo 2011 년

3
이 의견 덕분에 awk 'BEGIN {FS="\t"}; {print $1,FS,$2,FS,$3}' myFile.txt처음 세 열의 탭으로 구분 된 값을 인쇄하는 것을 발견했습니다 .
Wok

6
아니면 단순히awk 'BEGIN {OFS="\t"}; {print $1,$2,$3}'
요시야 Yoder 보낸

3
-v변수 설정에 대한 GNU 및 BSD awk 지원 . 인라인 프로그램BEGIN {FS="\t"} 내 에서 사용 하는 것은 추악하며 , 그렇게하려는 오픈 소스 기여는 반대 할 가능성이 높습니다. 프로그램 파일을 작성하는 경우에만 그렇게 하십시오 . 또한, 사용하는 것이 권장되지 않고 후자의 차종이 만 삭제하기 때문에 되고있는 설정을하지 . 마지막 지점에 대한 혼란이 처음에이 게시물의 원인입니다. 그래서 "좋은 스타일"이 중요합니다. -F-v FS=FSOFS
Bruno Bronosky

1
누구도 @Wok이 보여준 것을해서는 안됩니다. 출력에서 [입력] 필드 구분 기호를 열거하지 않습니다. OFS변수 를 통해 출력 필드 구분자를 지정 합니다.
Bruno Bronosky

답변:


143

OFS변수 (출력 필드 구분 기호)를 탭 으로 설정해야합니다 .

echo "$line" | 
awk -v var="$mycol_new" -F $'\t' 'BEGIN {OFS = FS} {$3 = var; print}'

( $lineecho 문에서 변수 를 인용해야합니다 )


6
$ '\ t'에서 $의 목적은 무엇입니까?
Amr Mostafa 2013 년

10
Advanced Bash Scripting Guide 의 내 질문에 답하기 : $ '...'인용 된 문자열 확장 구조는 이스케이프 된 8 진수 또는 16 진수 값을 사용하는 메커니즘입니다. 예를 들어 quote = $ '\ 042'.
Amr Mostafa 2013 년

5
@AmrMostafa, 가이드 당신이하지 않는 생각 하나를 선도하는 오해의 소지가 설명이 너무 나쁜 것을 $에서이 $'\t'필요하지 않습니다를. Greg의 위키 가 더 좋습니다. "이 중 $'...'가장 일반적이며 백 슬래시 이스케이프 된 조합이 ANSI C 표준에 지정된대로 확장된다는 점을 제외하고는 작은 따옴표처럼 작동합니다."
Cristian Ciupitu

9
돌이켜 보면는 $'\t'필요하지 않습니다. AWK는 문자열을 이해 "\t"탭 문자로
글렌 잭맨

5
오픈 소스 기고자 여러분, 제발 awk -F $'\t' 'BEGIN {OFS = FS} …'. 이어야합니다 awk -v FS='\t' -v OFS='\t' '…'. 현명한 것처럼 보일 수 있지만 일관성이 없으면 나중에 기여자가 코드를 오해하여 버그를 도입 할 가능성이 높아집니다.
Bruno Bronosky

21

그들이 정말로 탭인지 확인하십시오! bash에서는 다음을 사용하여 탭을 삽입 할 수 있습니다.C-v TAB

$ echo "LOAD_SETTLED    LOAD_INIT       2011-01-13 03:50:01" | awk -F$'\t' '{print $1}'
LOAD_SETTLED


9

사용하다:

awk -v FS='\t' -v OFS='\t' ...

내 스크립트 중 하나의 예 .

FSOFS변수를 사용하여 탭으로 구분 된 BIND 영역 파일을 조작합니다.

awk -v FS='\t' -v OFS='\t' \
    -v record_type=$record_type \
    -v hostname=$hostname \
    -v ip_address=$ip_address '
$1==hostname && $3==record_type {$4=ip_address}
{print}
' $zone_file > $temp

이것은 깨끗하고 읽기 쉬운 방법입니다.


5
echo "LOAD_SETTLED    LOAD_INIT       2011-01-13 03:50:01" | awk -v var="test" 'BEGIN { FS = "[ \t]+" } ; { print $1 "\t" var "\t" $3 }'

-2

작동하지 않습니까?

echo "LOAD_SETTLED    LOAD_INIT       2011-01-13 03:50:01" | awk '{print $1}'
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.