파이프로 구분된 파일의 날짜 필드 형식 지정

파이프로 구분된 파일의 날짜 필드 형식 지정

도움이 필요합니다. 다음 형식의 파이프로 구분된 파일이 있습니다.

Location|1111|222222|333333|Doe|John|19900723|19900724|19900725

마지막 3개 필드는 날짜 필드이지만 형식을 지정할 수 없는 것 같습니다. 다음과 같이 형식을 지정해야 합니다.1990/07/23. 나는 awk를 배우고 있으므로 awk를 통해 수행하는 것을 선호하지만 제안에 열려 있습니다.

답변1

Kusalananda가 언급했듯이 몇 가지 문자열 조작을 수행할 수 있습니다.

awk -F'|' -v OFS='|' '
    function format_date(d) { return substr(d,1,4) "/" substr(d,5,2) "/" substr(d,7) }
    { for (i = 7; i <= 9; i++) $i = format_date($i); print }
' file

답변2

awk -F'|' 'BEGIN {OFS="|"} {print $1,$2,$3,$4,$5,$6,strftime("%Y/%m/%d",$7),strftime("%Y/%m/%d",$8),strftime("%Y/%m/%d",$9)}' inputfile

여기서 중요한 점은 strftime()첫 번째 매개변수의 형식 문자열을 사용하여 두 번째 매개변수에 제공된 날짜의 형식을 지정한다는 것입니다.

$ echo "1552924174" | awk '{print strftime("%Y/%m/%d", $1) }'
2019/03/18

strftime()GNU awk및 Linux 에서는 지원되지만 mawkBSD에서는 지원되지 않습니다 awk.

답변3

나는 다음 방법으로 그것을했다

`echo "Location|1111|222222|333333|Doe|John|19900723|19900724|19900725"| awk -F "|" '{$NF=substr($NF,1,4)"/"substr($NF,5,2)"/"substr($NF,7,2);$(NF-1)=substr($(NF-1),1,4)"/"substr($(NF-1),5,2)"/"substr($(NF-1),7,2);$(NF-2)=substr($(NF-2),1,4)"/"substr($(NF-2),5,2)"/"substr($(NF-2),7,2);print $0}'| sed "s/ /`|/g"

산출

echo "Location|1111|222222|333333|Doe|John|19900723|19900724|19900725"| awk -F "|" '{$NF=substr($NF,1,4)"/"substr($NF,5,2)"/"substr($NF,7,2);$(NF-1)=substr($(NF-1),1,4)"/"substr($(NF-1),5,2)"/"substr($(NF-1),7,2);$(NF-2)=substr($(NF-2),1,4)"/"substr($(NF-2),5,2)"/"substr($(NF-2),7,2);print $0}'| sed "s/ /|/g"


Location|1111|222222|333333|Doe|John|1990/07/23|1990/07/24|1990/07/25

답변4

Perl아래 표시된 방법을 사용하여 이 작업을 수행 할 수 있습니다 .

입력하다:

$ cat file
Location|1111|222222|333333|Doe|John|19900723|19900724|19900725

$ perl -lpe 's#\|\K([0-9]{8})(?=(?:(?:\|[0-9]{8}){0,2})$)#join "/", unpack "A4A2A2", $1#ge' file
Location|1111|222222|333333|Doe|John|1990/07/23|1990/07/24|1990/07/25

설명하다:

  • -lRS = ORS = "\n"으로 설정
  • -p위에서 설정한 레코드 구분 기호를 사용하여 입력 파일의 레코드를 읽습니다. 또한 다음 레코드를 읽기 전에 현재 레코드가 표준 출력으로 인쇄됩니다.
  • -ePerl$_( )에서 읽은 각 레코드 에 이 옵션 뒤에 오는 코드를 적용합니다 .
  • 줄의 끝을 보기 전에 regex앞에 수직 막대가 있고 그 뒤에 같은 종류의 이웃이 최대 2개까지 오는 8자리 숫자를 찾습니다. 그들은 캡처에 저장됩니다 $1.
  • 이제 각 캡처는 패턴을 기반으로 압축이 $1풀린 A4A2A2다음 패턴이 함께 슬래시됩니다.

여분의:

$ perl -F'[|]' -pale '$_ = join "/", unpack "A4A2A2" for @F[-3..-1]; $_ = join "|", @F'

관련 정보