글쎄요, 이건 복잡한 질문이니까, 명확하게 설명하겠습니다. 내가 얻는 파일 내용은 다음과 같습니다.
$ 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
그런 다음 내부의 데이터를 데이터로 바꿉니다 File4
( File3
대괄호가 없는 데이터는 " 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만 나열되고 나머지는 표시되지 않더군요(마지막 데이터 열은 보관되어 있었습니다).
답변1
왜 물건을 왼쪽과 오른쪽으로 복사하고 싶은지 모르겠습니다. 간단한 것은
awk '{print "-" $2, substr($5,2,length($5)-2), "+", $4, ";"}' File1
처음 에 넣었다 -
가 ;
마지막에 넣었어요.
그 사이에 우리는 인쇄합니다
$2
우리는 그것을 있는 그대로 원하기 때문입니다.$5
첫 번째 문자와 마지막 문자가 없는 문자열인 의 하위 문자열 입니다. 위치 2에서 시작하는 첫 번째 문자를 건너뛰고(awk는 항상 이것에 대해 이상했습니다) 원래 문자열보다 두 자 짧은 하위 문자열만 선택하여 마지막 문자를 생략합니다.$5
+
우리가 그걸 원하니까- 그런 다음
$4
그러나 이러한 문자열 함수가 모두 GNU awk에만 해당되는지는 확실하지 않습니다.
답변2
그리고sed
sed '
s/\S\+\s/-/
s/\(\S\+\s\)\{2\}{\(\S\+\)}/\2 + \1;/
' File1
그리고앗다양성
awk -F"[[:blank:]{}]+" '{print "-" $2, $5, "+", $4}' ORS=" ;\n" File1
답변3
단순한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 솔루션:
txr -e '(awk (t (prn `-@[f 1] @{[f 4] [1..-1]} + @[f 3] ;`)))'
필드는 f
목록에 있으며 인덱스는 0부터 시작합니다.
답변4
$1,$2,...
필드에 사용하려는 정확한 문자열이 이미 포함되어 있으면 awk를 사용하는 것이 가장 쉽습니다. 필드 구분 기호에 여러 문자가 포함되어 있으면 정규식으로 해석됩니다. {중괄호}를 제거하기 위해 검색 및 바꾸기 또는 하위 문자열 작업을 수행할 필요가 없습니다. 우리는 그것들을 구분 기호의 일부로 간주합니다.
awk -F'[ {}]+' '{printf("-%s %s + %s ;\n", $2, $5, $4)}'
printf
대체를 사용하면 print
문자열 형식을 더 쉽게 볼 수 있지만 print "-"$2,$5" + "$4";"
대체를 사용하려는 경우 printf("-%s %s + %s ;\n", $2, $5, $4)
이는 옵션입니다.