他の列に影響を与えずに1つの列の値を並べ替えるには、awkまたはsedを使用します。

他の列に影響を与えずに1つの列の値を並べ替えるには、awkまたはsedを使用します。

次の形式のcsvファイルがあります。

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

5番目の列()のみを変更すると、次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ソリューション:

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

関連情報