Как изменить порядок полей с помощью AWK? - PullRequest
4 голосов
/ 01 августа 2010

У меня есть файл со следующим макетом:

123,01-08-2006
124,01-09-2007
125,01-10-2009
126,01-12-2010

Как я могу преобразовать его в следующее с помощью AWK?

123,2006-08-01
124,2007-09-01
125,2009-10-01
126,2009-12-01

Ответы [ 4 ]

3 голосов
/ 01 августа 2010

Не правильно прочитал вопрос в первый раз. Вам нужен разделитель полей, который может быть либо тире, либо запятой. Как только вы это сделаете, вы можете использовать тире в качестве разделителя выходных полей (как это наиболее распространено) и подделать запятую, используя конкатенацию:

awk -F',|-' 'OFS="-" {print $1 "," $4,$3,$2}' file
2 голосов
/ 01 августа 2010

Чистый awk

awk -F"," '{ n=split($2,b,"-");$2=b[3]"-"b[2]"-"b[1];$i=$1","$2 } 1' file

СЭД

sed -r 's/(^.[^,]*,)([0-9]{2})-([0-9]{2})-([0-9]{4})/\1\4-\3-\2/' file
sed 's/\(^.[^,]*,\)\([0-9][0-9]\)-\([0-9][0-9]\)-\([0-9]\+\)/\1\4-\3-\2/' file

Bash

#!/bin/bash

while IFS="," read -r a b
do
  IFS="-"
  set -- $b
  echo "$a,$3-$2-$1"
done <"file"
1 голос
/ 01 августа 2010

К сожалению, я думаю, что стандартный awk допускает только один символ разделителя полей, поэтому вам придется предварительно обрабатывать данные. Вы можете сделать это с tr, но если вы действительно хотите awk -только решение, используйте:

pax> echo '123,01-08-2006
124,01-09-2007
125,01-10-2009
126,01-12-2010' | awk -F, '{print $1"-"$2}' | awk -F- '{print $1","$4"-"$3"-"$2}'

Это выводит:

123,2006-08-01
124,2007-09-01
125,2009-10-01
126,2010-12-01

по желанию.

Первый awk изменяет символы , на -, так что у вас есть четыре поля, разделенные одним и тем же символом (для этого бита я обычно использую tr ',' '-').

Второй awk печатает их в указанном вами порядке, одновременно исправляя разделители полей.

Если вы используете реализацию awk, которая допускает несколько символов FS, вы можете использовать что-то вроде:

gawk -F ',|-' '{print $1","$4"-"$3"-"$2}'
0 голосов
/ 01 августа 2010

Если вам не нужен awk, вы также можете использовать Perl:

$ perl -nle 'print "$1,$4-$3-$2" while (/(\d{3}),(\d{2})-(\d{2})-(\d{4})\s*/g)' < file.txt
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...