awk에 대한 질문 복사합니다.File4 cp File1 File4 I는

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

$ 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가 모두 나열되어 있고 다른 데이터는 표시되지 않았습니다 (파일 하나의 마지막 열 데이터).



답변

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

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

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

우리 사이에 인쇄

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

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


답변

나오지

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

그리고 awk 변형

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


답변

간편한 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,$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)을 사용하려면 옵션입니다.


답변