перестройте значения в одном столбце, не влияя на другие столбцы с помощью awk или sed

Посмотрите на команду comm. Возьмите следующие два файла

f1.txt

item1
item2
item3
item4
item5
item6

f2.txt

item1
item2
item22
item3
item4

Output

$ comm -23 f1.txt f2.txt
item5
item6

man page entry для Comm

0
13.08.2014, 12:30
5 ответов

Другое решение для awk

awk -F, -va="([0-9]+)" '$0=gensub((a"-"a"-"a),"\\3/\\2/\\1","g")' file

-F, Устанавливает разделитель полей запятой

-va="([0-9]+)" Устанавливает переменную(а) в качестве регенерата в кавычках.

([0-9]+) Этот регекс соответствует любому числу в диапазоне 0-9(так что все числа действительно) и заключен в скобки, так что соответствие сохраняется.

$0=gensub Устанавливает $0(строка) на результат gensub

(a"-"a"-"a) Использует регекс из предыдущего для соответствия 'number' 'dash' 'number' 'dash' 'number'

, "\\3/\\2/\\1", "g") Обращает вспять согласованный порядок сохраненных и добавляет / между ними, а не то, что - не заключены в скобки и поэтому не сохранены. g просто означает, что это относится ко всем совпадениям.

.
0
28.01.2020, 02:37

Awk solution

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

An awk solution:

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

Explanation:

  • -F'[,-]: установите разделитель в , или -
  • '{printf "%s,%s,%s,%s/%s/%s,%s\n", $1, $2, $3, $6, $5, $4, $7}': распечатайте деталь в желаемом порядке и новую строку в конце.

And a sed solution:

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

Explanation:

  • \([0-9]*\)-\([0-9]*\)-\([0-9]*\): search for digits-dash-dash-digits (save the digits in subpatterns \1, \2 и \3)
  • \3/\2/\1 и заменяем их в обратном порядке на / между ними.
2
28.01.2020, 02:37

С помощью 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#'
0
28.01.2020, 02:37

Perl решение:

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

Теги

Похожие вопросы