古詩詞大全網 - 成語大全 - shell 身份證號先驗證再計算年齡、出生日期、性別。看了網上不少,其中身份證號有15位及18位。

shell 身份證號先驗證再計算年齡、出生日期、性別。看了網上不少,其中身份證號有15位及18位。

shell文件為id.sh,舊身份證文件和新身份證文件在開頭配置,例子中分別為id1.txt和id2.txt。

#!/bin/bash

# Usage: ./id.sh

in_file="id1.txt" # old id list file

out_file="id2.txt" # new id list file

pattern_id_15="^((11|12|13|14|15|21|22|23|31|32|33|34|35|36|37|41|42|43|44|45|46|50|51|52|53|54|61|62|63|64|65)[0-9]{4})([0-9]{2})([

0|1][0-9])([0-3][0-9])([0-9]{3})$"

pattern_id_18="^((11|12|13|14|15|21|22|23|31|32|33|34|35|36|37|41|42|43|44|45|46|50|51|52|53|54|61|62|63|64|65)[0-9]{4})([1|2][0-9]{

3})([0|1][0-9])([0-3][0-9])([0-9]{3})([0-9xX])$"

while read line

do

id=$line

if [[ $id =~ $pattern_id_15 ]]

then

year=${BASH_REMATCH[3]}

year="19$year"

month=${BASH_REMATCH[4]}

day=${BASH_REMATCH[5]}

sex_id=${BASH_REMATCH[6]}

year_now=`date +%Y`

birthday="$year-$month-$day"

((age=$year_now-$year))

if ((10#$sex_id%2==0))

then

sex="Female"

else

sex="Male"

fi

new_line="$id\t\t$age\t$birthday\t$sex"

echo -e $new_line >> $out_file

elif [[ $id =~ $pattern_id_18 ]]

then

year=${BASH_REMATCH[3]}

month=${BASH_REMATCH[4]}

day=${BASH_REMATCH[5]}

sex_id=${BASH_REMATCH[6]}

year_now=`date +%Y`

birthday="$year-$month-$day"

((age=$year_now-$year))

if ((10#$sex_id%2==0))

then

sex="Female"

else

sex="Male"

fi

new_line="$id\t$age\t$birthday\t$sex"

echo -e $new_line >> $out_file

fi

done < $in_file

測試的id1.txt內容為:

110312560208011

110312581229120

1213212442

11031219610613135x

11031219590829080X

aaaaaaaa

110312198203121803

110312200105020310

生產的id2.txt內容為:

110312560208011 55 1956-02-08 Male

110312581229120 53 1958-12-29 Female

11031219610613135x 50 1961-06-13 Male

11031219590829080X 52 1959-08-29 Female

110312198203121803 29 1982-03-12 Female

110312200105020310 10 2001-05-02 Male