6

TaskID_1文字列をから始まるシーケンスに置き換えたいのですが1001、これTaskID_1は入力ファイルに何行でも存在できます。TASKID_2同様に、入力ファイル内のすべての出現箇所を次のシーケンス値に置き換える必要があります1002

入力ファイル:

12345|45345|TaskID_1|dksj|kdjfdsjf|12
1245|425345|TaskID_1|dksj|kdjfdsjf|12
1234|25345|TaskID_2|dksj|kdjfdsjf|12
123425|65345|TaskID_2|dksj|kdjfdsjf|12
123425|15325|TaskID_1|dksj|kdjfdsjf|12
11345|55315|TaskID_2|dksj|kdjfdsjf|12
6345|15345|TaskID_3|dksj|kdjfdsjf|12
72345|25345|TaskID_4|dksj|kdjfdsjf|12
9345|411345|TaskID_3|dksj|kdjfdsjf|12

出力ファイルは次のようになります。

12345|45345|1001|dksj|kdjfdsjf|12
1245|425345|1001|dksj|kdjfdsjf|12
1234|25345|1002|dksj|kdjfdsjf|12
123425|65345|1002|dksj|kdjfdsjf|12
123425|15325|1001|dksj|kdjfdsjf|12
11345|55315|1002|dksj|kdjfdsjf|12
6345|15345|1003|dksj|kdjfdsjf|12
72345|25345|1004|dksj|kdjfdsjf|12
9345|411345|1003|dksj|kdjfdsjf|12
4

5 に答える 5

9

を使用する 1 つの方法を次に示しawkます。

awk 'BEGIN { FS=OFS="|" } { $3=1000 + NR }1' file

またはもう少し冗長に:

awk -F '|' '{ $3=1000 + NR }1' OFS='|' file

結果:

12345|45345|1001|dksj|kdjfdsjf|12
1245|425345|1002|dksj|kdjfdsjf|12
1234|25345|1003|dksj|kdjfdsjf|12
123425|65345|1004|dksj|kdjfdsjf|12
123425|15325|1005|dksj|kdjfdsjf|12
11345|55315|1006|dksj|kdjfdsjf|12
6345|15345|1007|dksj|kdjfdsjf|12
72345|25345|1008|dksj|kdjfdsjf|12
9345|411345|1009|dksj|kdjfdsjf|12

最初の例では、ファイル区切り文字と出力ファイル区切り文字が単一のパイプ文字に設定されています。これはBEGINブロックで設定されるため、入力のすべての行ではなく、1 回だけ実行されます。次に、3 番目の列を 1000 に増分変数を加えた値に設定します。この変数として使用することもできます++iが、代わりにNR(レコード番号/行番号の略) を使用することもできます。これにより、余分な変数を作成する必要がなくなります。最後の1は、デフォルトで印刷を有効にします。より詳細な解決策は次のようになります。

awk 'BEGIN { FS=OFS="|" } { $3=1000 + NR; print }' file

編集:

更新されたデータ ファイルを使用して、次のことを試してください。

awk 'BEGIN { FS=OFS="|" } { sub(/.*_/,"",$3); $3+=1000 }1' file

結果:

12345|45345|1001|dksj|kdjfdsjf|12
1245|425345|1001|dksj|kdjfdsjf|12
1234|25345|1002|dksj|kdjfdsjf|12
123425|65345|1002|dksj|kdjfdsjf|12
123425|15325|1001|dksj|kdjfdsjf|12
11345|55315|1002|dksj|kdjfdsjf|12
6345|15345|1003|dksj|kdjfdsjf|12
72345|25345|1004|dksj|kdjfdsjf|12
9345|411345|1003|dksj|kdjfdsjf|12
于 2012-12-19T12:26:06.693 に答える
4

1000を追加するSteveのロジックを使用したPerlソリューション:

perl -pne 's/TaskID_(\d+)/$1+1000/e;' file

これにより、「TaskID_n」が1000+nに置き換えられます。「e」は、置換を評価するために使用されます。

于 2012-12-19T14:03:40.600 に答える
2

スティーブがawkで提案したものよりも良い解決策を思いつくことはできません。

したがって、bash のみを使用する、より悪い解決策を次に示します。

#!/bin/bash

IFS='|'

while read f1 f2 f3 f4 f5 f6; do
    printf '%s|%s|%d|%s|%s|%s\n' "$f1" "$f2" "$((${f3#*_}+1000))" "$f4" "$f5" "$f6"
done < input

それが「悪い」のは、この種の問題に対して高速で効率的な awk よりもはるかに遅いためです。

于 2012-12-19T12:36:07.463 に答える
2

に置き換えます。1桁の ID の場合TaskID_100これは非常に簡単です。sed

$ sed 's/TaskID_/100/' file
12345|45345|1001|dksj|kdjfdsjf|12
1245|425345|1001|dksj|kdjfdsjf|12
1234|25345|1002|dksj|kdjfdsjf|12
123425|65345|1002|dksj|kdjfdsjf|12
123425|15325|1001|dksj|kdjfdsjf|12
11345|55315|1002|dksj|kdjfdsjf|12
6345|15345|1003|dksj|kdjfdsjf|12
72345|25345|1004|dksj|kdjfdsjf|12
9345|411345|1003|dksj|kdjfdsjf|12

この変更をファイルに保存するには、次の-iオプションを使用します。

sed -i 's/TaskID_/100/' file

注:これは、にマップしTaskID_[0-9]たい場合に機能しますが、これは機能しません。これはにマップされます。TaskID_231023TaskID_2310023

于 2012-12-19T14:07:39.300 に答える
0
perl -F"\|" -lane '$F[2]=~s/.*_/100/g;print join("|",@F)' your_file

以下でテスト:

> cat temp
12345|45345|TaskID_1|dksj|kdjfdsjf|12
1245|425345|TaskID_1|dksj|kdjfdsjf|12
1234|25345|TaskID_2|dksj|kdjfdsjf|12
123425|65345|TaskID_2|dksj|kdjfdsjf|12
123425|15325|TaskID_1|dksj|kdjfdsjf|12
11345|55315|TaskID_2|dksj|kdjfdsjf|12
6345|15345|TaskID_3|dksj|kdjfdsjf|12
72345|25345|TaskID_4|dksj|kdjfdsjf|12
9345|411345|TaskID_3|dksj|kdjfdsjf|12
> perl -F"\|" -lane '$F[2]=~s/.*_/100/g;print join("|",@F)' temp
12345|45345|1001|dksj|kdjfdsjf|12
1245|425345|1001|dksj|kdjfdsjf|12
1234|25345|1002|dksj|kdjfdsjf|12
123425|65345|1002|dksj|kdjfdsjf|12
123425|15325|1001|dksj|kdjfdsjf|12
11345|55315|1002|dksj|kdjfdsjf|12
6345|15345|1003|dksj|kdjfdsjf|12
72345|25345|1004|dksj|kdjfdsjf|12
9345|411345|1003|dksj|kdjfdsjf|12
> 
于 2012-12-20T06:46:38.640 に答える