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
하나의 매개변수가 있어야 하므로 다음을 사용하십시오 -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