수정된 텍스트의 AWK

수정된 텍스트의 AWK

다음 파일이 있습니다.

hello there. let's try&ACCT=1&bla bla bla&EX=1118&anything ss &SERIAL=1011&DEAL=NO
BLA BLA BLA&TOM=1&ACCT=2&LSLSLSLSL&none=1&EX=1218&lord=1&ok=1&SERIAL=201&flag=non

출력이 다음 과 같이 ACCT=되도록 추출해야 하는 필드 값은 다음과 같습니다 .EX=SERIAL=

1,11/18,1011
2,12/18,201

여기서 a를 중간 문자로 EX삽입하려는 4자리 숫자는 항상 입니다 ./

답변1

test.in이라는 파일에 넣은 샘플 입력을 기반으로 다음 awk 명령을 실행하면 원하는 출력이 제공됩니다.

awk -F\& '{for (i=1; i<+NF; i++) {if ($i ~ /^ACCT=/) {acct=$i; sub(/^ACCT=/, "", acct)} if ($i ~ /^EX=/) {ex=$i; sub(/^EX=/, "", ex); sub(/^[0-9][0-9]/, "&/", ex)} if ($i ~ /^SERIAL=/) {serial=$i; sub(/^SERIAL=/, "", serial)}} printf("%s,%s,%s\n", acct, ex, serial)}' test.in

그것이 하는 일은 &를 필드 구분자로 취급하는 것입니다. 그런 다음 ACCT=, EX= 또는 SERIAL=로 시작하는지 확인하여 지정된 행의 각 필드를 처리합니다. 필드가 발견되면 해당 필드가 적절한 변수에 할당됩니다. 그런 다음 하위 명령을 사용하여 변수의 시작 부분을 삭제합니다. 이는 해당 키와 관련된 값을 제공합니다.

EX 키의 처음 2자리 뒤에 슬래시(/)를 추가해야 하므로 이는 EX의 또 다른 하위 키입니다. 앰퍼샌드(&)는 역참조이며 처음 2자리 숫자를 가져오는 데 사용됩니다.

모든 필드가 처리된 후 행에서 찾은 값을 인쇄합니다.

답변2

다음을 사용해 보았고 예상대로 작동했습니다.

 k=`awk -F "&" '{print NF}' test.txt | sort | uniq| head -1`
for ((h=1;h<=$k;h++)); do awk -v h="$h" -F "&" '$h ~ /ACCT/ || $h ~ /EX/ || $h ~ /SERIAL/{print $h}' test.txt; done

산출

ACCT=1
ACCT=2
EX=1118
SERIAL=1011
EX=1218
SERIAL=201

답변3

sed&를 사용하여 cat솔루션의 한 단계를 구현했습니다. :)

sed 's/.*ACCT=\([0-9]*\).*/\1/' test > 1
sed 's/.*EX=\([0-9]*\).*/\1/' test > 2
sed 's/.*SERIAL=\([0-9]*\).*/\1/' test > 3

그 다음에

paste 1 2 3

답변4

다음 단계를 시도했는데 훌륭하게 작동합니다.

 for i in {1..9}; do awk -v i="$i" -F "&" '$i ~ /ACCT/ || $i ~ /SERIAL/{print $i}' p_final.txt; done | awk -F "=" '{print $NF}' >final.txt

for i in {1..9}; do awk -v i="$i" -F "&" '$i ~ /EX/{print $i}' p_final.txt; done| awk -F "=" '{print $NF}'| awk '{print substr($1,1,2)"/"substr($1,3,2)}' >>final.txt


cat final.txt  | sed -n '1~2p' | tr "\n" ","| sed 's/,$//g' | sed  "s/.*/&\n/g"  >output.txt
 cat final.txt  | sed -n '2~2p' | tr "\n" ","| sed 's/,$//g' | sed  "s/.*/&\n/g"  >>output.txt


[root@praveen_linux_example ~]# cat output.txt
1,1011,11/18
2,201,12/18
[root@praveen_l

관련 정보