awk를 통해 행의 한 열을 변경하고 다른 열을 추가하는 방법

awk를 통해 행의 한 열을 변경하고 다른 열을 추가하는 방법

다음 레코드가 포함된 MDD.TXT 파일이 있습니다. 파일: MDD.TXT

0|ABC|055309|20120929053309|11965150   
0|ABC|061434|20120929063434|11155537  
0|ABC|070228|20120929073228|11965150  
0|ABC|082213|20120929583213|11965150  
0|ABC|083950|20120929983950|11965150  
0|ABC|084112|20120929083112|11965150

이제 두 번째 열을 "XYZ"로 바꾸고 두 개의 열 filename과 "Success"를 모든 레코드에 추가하려고 합니다. 원하는 출력은 다음과 같아야 합니다.

0|XYZ|055309|20120929053309|11965150|MDD.TXT|SUCCESS
0|XYZ|061434|20120929063434|11155537|MDD.TXT|SUCCESS
0|XYZ|070228|20120929073228|11965150|MDD.TXT|SUCCESS
0|XYZ|082213|20120929583213|11965150|MDD.TXT|SUCCESS
0|XYZ|083950|20120929983950|11965150|MDD.TXT|SUCCESS
0|XYZ|084112|20120929083112|11965150|MDD.TXT|SUCCESS

답변1

sed당신은 또한 사용할 수 있습니다

$ sed -e 's/\bABC\b/XYZ/g' -e 's/$/|MDD.TXT|SUCCESS/g' MDD.TXT

파일을 직접 수정

$ sed -i -e 's/\bABC\b/XYZ/g' -e 's/$/|MDD.TXT|SUCCESS/g' MDD.TXT

원본 파일을 유지하고 원하는 출력을 다른 파일로 리디렉션

$ sed -e 's/\bABC\b/XYZ/g' -e 's/$/|MDD.TXT|SUCCESS/g' MDD.TXT >> MDD_MODIFFIED.TXT

답변2

다음을 시도해 볼 수 있습니다 awk.

awk 'BEGIN { FS = OFS = "|" } { $2 = "XYZ"; $6 = ARGV[1]; $7 = "SUCCESS";} 1' MDD.TXT

또는:

awk 'BEGIN { FS = OFS = "|" } { $2 = "XYZ"; print $0 OFS ARGV[1] OFS "SUCCESS"; }' MDD.TXT

답변3

그리고 awk:

awk 'BEGIN{OFS=FS="|"} {$2="XYZ"; $0=$0"|"FILENAME"|SUCCESS"}1' mdd.txt

어디:

  • BEGIN{}모든 줄이 아닌 처음에만 실행됩니다.
  • OFS=FS="|"입력 및 출력 필드 구분 기호를 로 설정합니다 |.
  • $2="XYZ"두 번째 필드를 다음으로 설정합니다.XYZ
  • $0=...FILENAMEawk( 내부 변수 에서 ) SUCCESS전체 행에 문자열로 추가됩니다.

답변4

이는 기존 답변과 동일 awk하지만 더 간결합니다.

awk -F'|' -vOFS="|" '{$2="XYZ"; print $0,"MDD.TXT","SUCCESS"}' MDD.TXT

파일 이름(모든 파일 이름에 대해)을 자동으로 추가하려면 다음을 사용하십시오.

awk -F'|' -vOFS="|" '{$2="XYZ"; print $0,ARGV[1],"SUCCESS"}' MDD.TXT

-F입력 레코드 구분자를 설정 하고 변수 및 출력 레코드 구분자를 -vOFS설정합니다 . OFS그런 다음 두 번째 필드를 로 설정하고 XYZ행( $0), 파일 이름( ARGV[1]) 및 SUCCESS.

귀하의 예에서 각 줄에는 후행 공백이 있으므로 제안된 솔루션을 실행하면 다음과 같은 결과가 발생합니다.

$ awk -F'|' -vOFS="|" '{$2="XYZ"; print $0,ARGV[1],"SUCCESS"}' MDD.TXT 
0|XYZ|055309|20120929053309|11965150   |MDD.TXT|SUCCESS
0|XYZ|061434|20120929063434|11155537  |MDD.TXT|SUCCESS
0|XYZ|070228|20120929073228|11965150  |MDD.TXT|SUCCESS
0|XYZ|082213|20120929583213|11965150  |MDD.TXT|SUCCESS
0|XYZ|083950|20120929983950|11965150  |MDD.TXT|SUCCESS
0|XYZ|084112|20120929083112|11965150|MDD.TXT|SUCCESS

이를 방지하려면 입력 필드 구분 기호를 다음과 같이 설정할 수 있습니다.| 또는공간:

$ awk -F' |' -vOFS="|" '{$2="XYZ"; print $0,ARGV[1],"SUCCESS"}' MDD.TXT 
0|ABC|055309|20120929053309|11965150|XYZ|||MDD.TXT|SUCCESS
0|ABC|061434|20120929063434|11155537|XYZ||MDD.TXT|SUCCESS
0|ABC|070228|20120929073228|11965150|XYZ||MDD.TXT|SUCCESS
0|ABC|082213|20120929583213|11965150|XYZ||MDD.TXT|SUCCESS
0|ABC|083950|20120929983950|11965150|XYZ||MDD.TXT|SUCCESS
0|ABC|084112|20120929083112|11965150|XYZ|MDD.TXT|SUCCESS

또는 파일을 구문 분석하기 전에 후행 공백을 제거할 수 있습니다.

sed 's/\s*$//' MDD.TXT | 
    awk -F' |' -vOFS="|" '{$2="XYZ"; print $0,"MDD.TXT|SUCCESS"}'

관련 정보