![繰り返し部分をハイフンで置き換えて数値リストを簡単に拡張するには?](https://linux33.com/image/147489/%E7%B9%B0%E3%82%8A%E8%BF%94%E3%81%97%E9%83%A8%E5%88%86%E3%82%92%E3%83%8F%E3%82%A4%E3%83%95%E3%83%B3%E3%81%A7%E7%BD%AE%E3%81%8D%E6%8F%9B%E3%81%88%E3%81%A6%E6%95%B0%E5%80%A4%E3%83%AA%E3%82%B9%E3%83%88%E3%82%92%E7%B0%A1%E5%8D%98%E3%81%AB%E6%8B%A1%E5%BC%B5%E3%81%99%E3%82%8B%E3%81%AB%E3%81%AF%EF%BC%9F.png)
注目!正規表現とサンプルデータを変更したため、一部の回答が間違っている可能性があります!これが悪い習慣なら謝ります。
私はgrep(オンラインツール)を使ってデータリストを抽出しました。ここで繰り返される部分は、時々ハイフン(-oフラグ)に置き換えられます。数字は常に8桁です。使用される正規表現の後には、8桁の数字が続くことがあります。[0-9]{8}(, -[0-9]*)*(, [0-9]{8})*
以下のデータの例:
33520470
33520850, -60, -70, -80, -90, 33630077
25453810
13815206, -07, -08, 60682651, 60709994
13340820
61040146, -55
60819060, -79
60819088
私が望む出力は次のとおりです。
33520470
33520850
33520860
33520870
33520880
33520890
33630077
25453810
13815206
13815207
13815208
60682651
60709994
13340820
61040146
61040155
60819060
60819079
60819088
grepでできますか?そうでない場合は、この結果を得るためにUnixや他のツールを提案できますか?私はsedまたはawkを考えています。
編集:この問題は修正されました。便宜上、コメントを注意深く読む必要がないように、ここに正しいコマンドを含めます。
-F ', ' '{ print $1; for(a=2;a <= NF; a ++){ if(length($a) <= 7){ printf("%s%s\n",substr($1,1,length($1)-(length($a)-1)),substr($a, 2))} else { print $a } } }'
答え1
私はawkを使ってみました。
cat file | awk -F ', ' '{ print $1; for(a=2;a <= NF; a ++){printf("%s%s\n",substr($1,1,length($1)-(length($a)-1)),substr($a, 2)) } }'
出力:
33520470
33520850
33520860
33520870
33520880
33520890
25453810
13340820
61040146
61040155
60819060
60819079
60819088
編集する:
正しい結果を得るコード:
cat file | awk -F ', ' '{ print $1; for(a=2;a <= NF; a ++){ if(length($a) <= 3){ printf("%s%s\n",substr($1,1,length($1)-(length($a)-1)),substr($a, 2))} else { print $a } } }'
結果:
33520470
33520850
33520860
33520870
33520880
33520890
33630077
25453810
13815206
13815207
13815208
60682651
60709994
13340820
61040146
61040155
60819060
60819079
60819088
答え2
修正する前処理ステップを使用して変更された入力を処理します。
この回答の残りの部分では、データが前処理されたと仮定します。
grep -oE '[0-9]{8}(, -[0-9]+)*'
つまり、完璧なソリューションには次のものが必要です。
grep -oE ... file | awk ...
BEGIN { FS = ", *" }
{
print $1
for (i = 2; i <= NF; ++i)
print substr($1, 1, length($1) - length($i) + 1) substr($i, 2)
}
スクリプトawk
は1行を読み取り、最初のカンマ区切りフィールドを印刷します。次に、残りのフィールドを繰り返して最初のフィールドを出力し、後で-
他のフィールドに文字を挿入するのに十分な終わりの文字を切り取ります。
このコードは可変長の「サフィックス」を受け入れます。
テスト:
$ awk -f script.awk file
33520470
33520850
33520860
33520870
33520880
33520890
25453810
13340820
61040146
61040155
60819060
60819079
60819088
他の例:
$ cat file
1111
2222,-3,-4, -33,-44, -333,-444
$ awk -f script.awk file
1111
2222
2223
2224
2233
2244
2333
2444
「一行」で:
awk -F ', *' '{print $1; for(i=2;i<=NF;++i)print substr($1,1,length($1)-length($i)+1)substr($i,2)}' file