awk에 대한 질문


9

이것은 복잡한 질문이므로 명확하게 설명하겠습니다. 아래와 같이 파일 내용이 있습니다.

$ Cat File1 
ABC Cool Lol POP {MNB}
ABC Cool Lol POP {MNB}
ABC Cool Lol POP {MNB}
ABC Cool Lol POP {TBMKF}
ABC Cool Lol POP {YUKER}
ABC Cool Lol POP {EFEFVD}

내가 원하는 결과

-Cool MNB +  POP ;
-Cool MNB  + POP ;
-Cool MNB  + POP ;
-Cool TBMKF + POP ;
-Cool YUKER + POP ;
-Cool EFEFVD +POP ;

먼저 마지막 열을 File1꺼내어 인쇄하려고합니다. sed 's/[{}//g' File1 > File3

그 후 나는 전체 내용을 File1새로운 것으로 복사합니다.File4

cp File1 File4

I는 내부의 데이터를 교체 이후 File4File3데이터 (브래킷 일없이 수단에게 데이터를 " File1마지막 열 한 그")

awk 'FNR==NR{a[NR]=$1;next}{$5=a[FNR]}1' File3 File4 >>File5 

출력은 다음과 같아야합니다

ABC Cool Lol POP MNB
ABC Cool Lol POP MNB
ABC Cool Lol POP MNB
ABC Cool Lol POP TBMKF
ABC Cool Lol POP YUKER
ABC Cool Lol POP EFEFVD

마지막으로 시도합니다

awk -F " '{print - $2,$5 +,$4 ";"}‘ File5

그러나 결과가 내가 원하는대로 나오지 않았고 유사한 데이터 만 MNB가 모두 나열되어 있고 다른 데이터는 표시되지 않았습니다 (파일 하나의 마지막 열 데이터).


gnu awk를 사용하고 있습니까?
123

나는 u가 무엇을 의미하는지 잘 모르겠습니다. 그러나 awk를 만지기위한 새로운 초보자 일뿐입니다. 이것은 내가해야 할 과제입니다.
heng960407

1
type awk --version, 결과는 무엇입니까?
123

2
제목을 문제와 관련된 것으로 변경하십시오. 이렇게하면 앞으로 비슷한 질문이있는 사람들이 더 쉽게 찾을 수 있습니다. 현재 "awk에 대한 질문"은 매우 일반적입니다.
Tom Fenech

답변:


16

왜 당신이 물건을 좌우로 복사하는지 모르겠습니다. 간단한 것은

awk '{print "-" $2, substr($5,2,length($5)-2), "+", $4, ";"}' File1

나는 -시작과 ;끝을 넣었다 .

우리 사이에 인쇄

  • $2 우리는 그것을 그대로 원하기 때문입니다.
  • 의 하위 $5문자열. 첫 번째와 마지막 문자가없는 문자열입니다. 우리는 위치 2에서 시작하여 첫 번째 문자를 건너 뛰고 (awk는 항상 이상했습니다) 원래 문자보다 두 문자가 짧은 하위 문자열 만 선택하여 마지막 문자를 제외합니다$5
  • +우리가 원하는 때문에
  • 그리고 $4

그러나 이러한 모든 문자열 함수가 GNU awk에만 해당되는지 확실하지 않습니다.


substr(string, 2)문자열이 두 번째 문자, 등으로부터 반환 cut -c2-, tail -n +2, sed '2,$'... 그것에 대해 이상한 무엇입니까?
Stéphane Chazelas

3
이 명령은 표준이며 awk70 년대 의 원본과도 작동 합니다.
Stéphane Chazelas

@ StéphaneChazelas : 아, 나는 당신을 기다리고 있습니다 :-) 일반적으로 우리는 0부터 세기 시작합니다. 즉, 인덱스 2는 세 번째 위치이지만 두 번째 위치는 인덱스 2입니다. 나머지 GNU 질문을 분명히 해 주셔서 감사합니다.
Bananguin

@Bananguin, 위의 몇 가지 예에서 볼 수 있듯이 유닉스 쉘과 유틸리티에서 우리는 0이 아닌 1에서 시작합니다. 가장 주목할만한 예외는 ksh의 배열과 $ {var : offset} (둘 다 bash로 복사)입니다. 다른 모든 쉘 배열은 1부터 시작합니다. 참조 Zsh 배열의 첫 번째 요소가 0 대신 1로 색인되는 이유가 있습니까?
Stéphane Chazelas

7

나오지

sed '
    s/\S\+\s/-/
    s/\(\S\+\s\)\{2\}{\(\S\+\)}/\2 + \1;/
    ' File1

그리고 awk 변형

awk -F"[[:blank:]{}]+" '{print "-" $2, $5, "+", $4}' ORS=" ;\n" File1

6

간편한 TXR 작업 :

$ txr -c '@(repeat)
@a @b @c @d {@e}
@(do (put-line `-@b @e + @d ;`))
@(end)' -
ABC Cool Lol POP {MNB}
ABC Cool Lol POP {MNB}
ABC Cool Lol POP {MNB}
ABC Cool Lol POP {TBMKF}
ABC Cool Lol POP {YUKER}
ABC Cool Lol POP {EFEFVD}
[Ctrl-D][Enter]
-Cool MNB + POP ;
-Cool MNB + POP ;
-Cool MNB + POP ;
-Cool TBMKF + POP ;
-Cool YUKER + POP ;
-Cool EFEFVD + POP ;

TXR Lisp awk 매크로 를 사용하여 Awk 솔루션을 음역 :

 txr -e '(awk (t (prn `-@[f 1] @{[f 4] [1..-1]} + @[f 3] ;`)))'

필드가 f목록에 있으며 인덱싱은 0을 기준으로합니다.


1
lisp와 crytiest보기를 위해 +1! 그 언어는 반드시 pcg (프로그래밍 코드 골프)에서 경쟁해야합니다
Archemar

@Archemar TXR은 개별 캐릭터에 기능을 할당하는 등의 기능을 수행 할 수있는 특수 언어가 구성되어있어 작곡을 달성하기 위해 골프를 치고 경쟁하기가 쉽지 않습니다.
Kaz

@Archemar 다음 항목을 입력하십시오 : codegolf.stackexchange.com/questions/68712/output-the-next-kana
Kaz

1
@Kaz 어딘가에 TXR 튜토리얼이 있습니까? 매뉴얼 페이지는 다소 큰 것 같습니다. awk와 비교하여 어떻게 수행됩니까?
bli

1
@bli GNU Awk는 TXR awk 매크로보다 큰 파일을 통해 기본 필드를 분할 할 때 기본 필드에서 30 배 이상 빠르며, 이는 입력 소스를 레코드 및 필드로 처리하기위한 전체 루프를 포함하여 220 줄 이상의 해석 된 코드 입니다.
Kaz

3

$1,$2,...필드에 이미 작업하려는 정확한 문자열이 포함되어있는 경우 awk를 사용하는 것이 가장 쉽습니다 . 필드 구분 기호가 둘 이상의 문자를 포함하는 경우 정규식으로 해석됩니다. {curly braces}를 제거하기 위해 검색 및 바꾸기 또는 하위 문자열 작업을 수행 할 필요가 없습니다. 우리는 그것들을 구분자의 일부로 계산합니다.

awk -F'[ {}]+' '{printf("-%s %s + %s ;\n", $2, $5, $4)}'

printf대신에을 사용 print하면 문자열의 형식을 쉽게 확인할 수 있지만 print "-"$2,$5" + "$4";"대신 printf("-%s %s + %s ;\n", $2, $5, $4)을 사용하려면 옵션입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.