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
内部にあるので、file
sedを使用する方が高速です。
sed -i 's/[0-9]\{18,\}/-/g' file
この-i
オプションを理解すると、ファイルが変更されます。コミットする前に実行された操作を表示するには、削除してください-i
。
BSDには-i
1つのパラメータが必要です-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