パイプで区切られたファイルがあります。
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
各レコードの外部中括弧内のすべての内容は無条件に実行されるため、各行に対して値がリセットされます。
初期化をn
このBEGIN
ブロックに移動する必要があります。
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