도움이 필요합니다. 다음 형식의 파이프로 구분된 파일이 있습니다.
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 에서는 지원되지만 mawk
BSD에서는 지원되지 않습니다 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
설명하다:
-l
RS = ORS = "\n"으로 설정-p
위에서 설정한 레코드 구분 기호를 사용하여 입력 파일의 레코드를 읽습니다. 또한 다음 레코드를 읽기 전에 현재 레코드가 표준 출력으로 인쇄됩니다.-e
Perl
$_
( )에서 읽은 각 레코드 에 이 옵션 뒤에 오는 코드를 적용합니다 .- 줄의 끝을 보기 전에
regex
앞에 수직 막대가 있고 그 뒤에 같은 종류의 이웃이 최대 2개까지 오는 8자리 숫자를 찾습니다. 그들은 캡처에 저장됩니다$1
. - 이제 각 캡처는 패턴을 기반으로 압축이
$1
풀린A4A2A2
다음 패턴이 함께 슬래시됩니다.
여분의:
$ perl -F'[|]' -pale '$_ = join "/", unpack "A4A2A2" for @F[-3..-1]; $_ = join "|", @F'