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에는 -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

관련 정보