次の形式の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