awk 스크립트는 값을 if로 대체합니다.

awk 스크립트는 값을 if로 대체합니다.

파이프로 구분된 파일이 있습니다.

d1000|1000
d1001|100
d1002|10
d1003|1
d1004|
d1005|

길이가 4자리 미만인 경우 $2를 수정하고 공백은 변경하지 않고 그대로 두고 싶습니다.

그러니 awk 스크립트를 통해 시도해 보세요.

BEGIN { FS="|"; OFS="\t" }

{
n=1100
{ if (length($2)!=4 && length($2)>0) {$2=++n}};

print $1, $2
}

하지만 같은 숫자가 계속해서 인쇄됩니다.

d1000   1000
d1001   1101
d1002   1101
d1003   1101
d1004
d1005

그리고 원하는 출력

d1000   1000
d1001   1101
d1002   1102
d1003   1103
d1004
d1005

편집: 다음은 명확하게 형식화된 위의 코드입니다 gawk -o-.

BEGIN {
        FS = "|"
        OFS = "\t"
}

{
        n = 1100
        if (length($2) != 4 && length($2) > 0) {
                $2 = ++n
        }
        print $1, $2
}

답변1

들여쓰기가 더 일관적이라면 오류가 분명할 수 있습니다.

BEGIN { FS="|"; OFS="\t" }
{
  n=1100
  {
    if (length($2)!=4 && length($2)>0) {
      $2=++n
    }
  };
  print $1, $2
}

n각 레코드에 대해 외부 중괄호 안의 모든 내용은 무조건 실행되므로 각 행에 대해 값이 재설정됩니다.

초기화를 nBEGIN블록으로 이동해야 합니다.

BEGIN { FS="|"; OFS="\t"; n=1100 }
{
  {
    if (length($2)!=4 && length($2)>0) {
      $2=++n
    }
  };
  print $1, $2
}

또는 (더 관용적으로)

BEGIN { FS="|"; OFS="\t"; n=1100 }
(length($2)!=4 && length($2)>0) {
  $2=++n
}
{
  print $1, $2
}

답변2

나는 이 솔루션을 제안합니다:

$ awk -F'|' -v OFS='\t' '$2 ~ /^[0-9]{1,3}$/ { $2 = 1100 +(++c) } { print $1,$2 }' file 
d1000   1000
d1001   1101
d1002   1102
d1003   1103
d1004
d1005

관련 정보