awk - 列の17桁より大きい数字を-に置き換えます。

awk - 列の17桁より大きい数字を-に置き換えます。

UTCタイムスタンプ値を含むCSVファイルがあります-

たとえば、次はCSVファイルの列です。

+1234|2|12|1|1|1537820114232192380|0  +1234|2|12|1|1|1537820113262689150|0

出力は次のようになります。

+1234|2|12|1|1|-|0  +1234|2|12|1|1|-|0

答え1

内部にあるので、filesedを使用する方が高速です。

sed -i 's/[0-9]\{18,\}/-/g' file

この-iオプションを理解すると、ファイルが変更されます。コミットする前に実行された操作を表示するには、削除してください-i

BSDには-i1つのパラメータが必要です-i ''

awkはまた、次のことができます。

<file awk '{gsub("[0-9]{18,}", "-")}1'  >newfile

答え2

awk次のように使用できます。

echo "+1234|2|12|1|1|1537820114232192380|0  +1234|2|12|1|1|1537820113262689150|0" | awk '{gsub("[0-9]{18,}", "-")}1'
  +1234|2|12|1|1|-|0  +1234|2|12|1|1|-|0

sed次のように使用できます。

  echo "+1234|2|12|1|1|1537820114232192380|0  +1234|2|12|1|1|1537820113262689150|0" | sed -r 's/[0-9]{18,}/-/g'
  +1234|2|12|1|1|-|0  +1234|2|12|1|1|-|0

答え3

何らかの理由で awk 以外の正規表現やツールを使用したくない場合は、次のように選択できます。奇妙な条件文

echo "+1234|2|12|1|1|1537820114232192380|0  +1234|2|12|1|1|1537820113262689150|0" | awk -F'|' 'OFS="|" { for (i = 1; i <= NF; i++) { if (length($i) > 17) { $i = "-"} } print; }'

+1234|2|12|1|1|-|0  +1234|2|12|1|1|-|0

説明する:

-F'|'                            # Set input field-separator to bar
'OFS="|"                         # Set output field-separator to bar
{ for (i = 1; i <= NF; i++) {    # Loop through the fields
if (length($i) > 17) { $i = "-"} # Set a field with length over 17 to "-"
} print; }'                      # Print output of all fields after this process

答え4

私はawkを使用してこれのバリエーションを使用し(そしてsedを使用して末尾のORSを改行に置き換えて)確認しますひも長さは17文字以上です。

awk -vRS='[|\n]' -vORS='|' 'length($0)>=17{$0="-"}1' | sed 's/|$/\n/'

フィルタリングのみ数字17桁を超える場合は、次の操作を行います。

awk -vRS='[|\n]' -vORS='|' 'log($0)/log(2)>=17{$0="-"}1' | sed 's/|$/\n/'

sedを完全に避け、単一のawkプロセスを使用するいくつかのヒントもあります。次のようになります。https://stackoverflow.com/questions/34684958/make-the-record-seperator-in-awk-not-apply-after-the-last-record

これにより、awkのレコード分割とフィルタリング機能を使用でき、正規表現よりもフィルタをより正確に制御できます。

検証テスト:

$ awk -vRS='[|\n]' -vORS='|' 'length($0)>=17{$0="-"}1' <<< '+1234|2|12|1|1|1537820114232192380|0  +1234|2|12|1|1|1537820113262689150|0' | sed 's/|$/\n/'
+1234|2|12|1|1|-|0  +1234|2|12|1|1|-|0

$ awk -vRS='[|\n]' -vORS='|' 'log($0)/log(2)>=17{$0="-"}1' <<< '+1234|2|12|1|1|1537820114232192380|0  +1234|2|12|1|1|1537820113262689150|0' | sed 's/|$/\n/'
+1234|2|12|1|1|-|0  +1234|2|12|1|1|-|0

関連情報