замена символов в 3-м столбце с помощью sed / awk - PullRequest
0 голосов
/ 05 января 2011

В файлах 3 столбца:

123711184642,3583090366663629,0036f920012437d4 123715942138,3538710295145500,0136f920afd6c643

Я хочу удалить первые два символа в третьем столбце: 1237583036164 12363326464264232363664464, 3538710295145500,36f920afd6c643

И поменяйте местами первые 6 символов третьего столбца в двойках так, чтобы конечный результат был: 123711184642,3583090366663629,639f02012437d4 123715942138,3538710295145500,639 * 100 * Any7 1007 *1003* 883быть оцененнымBernie

Ответы [ 5 ]

1 голос
/ 05 января 2011

С sed это просто вопрос группировки:

sed '
    s/\(.*,\)../\1/;
    s/,\(.\)\(.\)\(.\)\(.\)\(.\)\(.\)\([^,]*\)$/,\2\1\4\3\6\5\7/' file
1 голос
/ 05 января 2011

с глазком:

gawk -F, '
    BEGIN {OFS=FS}
    { 
        $3 = gensub(/^..(.)(.)(.)(.)(.)(.)(.*)/, "\\2\\1\\4\\3\\6\\5\\7", 1, $3)
        print
    }
' in.txt
1 голос
/ 05 января 2011

Предполагая, что ваши входные данные находятся в файле "foo", вы можете сделать:

cat foo | awk -F "," -f awkfile

где awkfile будет содержать:

{
  v = ""
  p = $3
  printf ("%s,%s,", $1, $2)
  for (i=3; i<9; i=i+2) {
     printf ("%s%s", substr(p, i+1, 1), substr (p, i, 1))
  }
  printf ("%s\n", substr(p, 9))
}
0 голосов
/ 05 января 2011

awk 1-лайнер просто для удовольствия.Это не имеет значения, сколько пар чисел находится в 3-м поле, оно будет работать на всех них.

awk -F, '{$ 3 = substr (gensub (/ (.) (.) /, "\ 2 \ 1", "g", $ 3), 3)} 1 'OFS =, / путь / к / файлу

Ввод

$ cat ./infile
123711184642,3583090366663629,0036f920012437d4
123715942138,3538710295145500,0136f920afd6c643

Вывод

$ awk -F, '{$3=substr(gensub(/(.)(.)/,"\\2\\1","g",$3),3)}1' OFS=, ./infile
123711184642,3583090366663629,639f021042734d
123715942138,3538710295145500,639f02fa6d6c34
0 голосов
/ 05 января 2011

sed 1-вкладыш.Неважно, сколько полей у вас есть, если вы просто хотите изменить последнее.Это также не заботится о том, сколько пар имеет последнее поле, оно поменяет их местами точно так же.

sed 'h; s /^., .. //; s /(.) (.) / \ 2 \ 1 / g; x; s /, [^,] $ /, /; G; s / \ n // '/ path / to / file

Ввод

$ cat ./infile
123711184642,3583090366663629,0036f920012437d4
123715942138,3538710295145500,0136f920afd6c643

Ввод

$ sed 'h;s/^.*,..//;s/\(.\)\(.\)/\2\1/g;x;s/,[^,]*$/,/;G;s/\n//' ./infile
123711184642,3583090366663629,639f021042734d
123715942138,3538710295145500,639f02fa6d6c34

Пояснение

  1. h - сделать копию всего
  2. s/^.*,..// - пространство образца теперь содержит только последнее поле с удаленными двумя старшими числами
  3. s/\(.\)\(.\)/\2\1/g - парные числа заменяются в пространстве образца
  4. x - поменять пространство шаблона с пробелом
  5. s/,[^,]*$/,/ - удалить все последнее поле
  6. G - добавить пространство удержания к пространству шаблона с помощью \ nмежду ними
  7. s/\n// - Удалить '\ n', добавленное G
...