Посмотрите на команду 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
Другое решение для 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
просто означает, что это относится ко всем совпадениям.
Awk solution
awk -F ',' '{split($4, a, "-"); $4 = (a[3] "/" a[2] "/" a[1])}1' OFS=, file
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
и заменяем их в обратном порядке на /
между ними. С помощью 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#'
Perl решение:
perl -aF'[,-]' -ne 'print join ",", @F[0..2], join("/", @F[5,4,3]), $F[6]' < input