다른 열에 영향을 주지 않고 한 열의 값을 재정렬하려면 awk 또는 sed를 사용하세요.

다른 열에 영향을 주지 않고 한 열의 값을 재정렬하려면 awk 또는 sed를 사용하세요.

다음 형식의 csv 파일이 있습니다.

abc,124,123,2014-08-13,abc
def,124,123,2014-08-13,abc
ghi,124,123,2014-08-13,abc

이제 다섯 번째 열( )만 수정하면 2014-08-13아래와 같은 출력이 생성됩니다.

abc,124,123,13/08/2014,abc
def,124,123,13/08/2014,abc
ghi,124,123,13/08/2014,abc

가능하다면 라이너 awk나 솔루션을 사용하는 것이 좋습니다.sed

답변1

해결책 awk:

awk -F'[,-]' '{printf "%s,%s,%s,%s/%s/%s,%s\n", $1, $2, $3, $6, $5, $4, $7}' file

설명하다:

  • -F'[,-]: 구분 기호를 ,또는 로 설정합니다.-
  • '{printf "%s,%s,%s,%s/%s/%s,%s\n", $1, $2, $3, $6, $5, $4, $7}': 끝에 개행 문자를 사용하여 원하는 순서로 섹션을 인쇄합니다.

해결책은 다음 과 같습니다 sed.

sed 's|\([0-9]*\)-\([0-9]*\)-\([0-9]*\)|\3/\2/\1|g' file

설명하다:

  • \([0-9]*\)-\([0-9]*\)-\([0-9]*\):digits-dash-digits-dash-digits 검색 (하위 패턴 \1, \2합계 에 숫자 저장 \3)
  • \3/\2/\1/중간 순서 로 역순으로 교체하십시오 .

답변2

펄 솔루션:

perl -aF'[,-]' -ne 'print join ",", @F[0..2], join("/", @F[5,4,3]), $F[6]' < input

답변3

그리고 sed:

$ sed -e 's#\([0-9]\{1,\}\)-\([0-9]\{1,\}\)-\([0-9]\{1,\}\)#\3/\2/\1#' file
abc,124,123,13/08/2014,abc
def,124,123,13/08/2014,abc
ghi,124,123,13/08/2014,abc

GNU 또는 FreeBSD가 있는 경우 다음을 sed사용할 수 있습니다.

sed -E 's#([0-9]+)-([0-9]+)-([0-9]+)#\3/\2/\1#' file

또는 perl:

perl -pe 's#(\d+)-(\d+)-(\d+)#$3/$2/$1#'

답변4

이상한 솔루션

awk -F ',' '{split($4, a, "-"); $4 = (a[3] "/" a[2] "/" a[1])}1' OFS=, file

관련 정보