Это звучит как проблема XY и что вы на самом деле хотите:
awk -F, '$2 == prev; {prev = $2}' < parsed_repayment.csv
То есть укажите строки, в которых второе поле совпадает со вторым полем предыдущей строки.
Для ответа на то, что вы спросили, в отличие от того, что вы на самом деле хотели, это будет:
cut -d, -f2 parsed_repayment.csv |
uniq -d |
xargs sh -c '
for i do
grep -e "$i" parsed_repayment.csv | tail -n +2
done' sh
Но с некоторыми оговорками:
xargs
предполагает очень специфический формат ввода. Если значения второго столбца содержат пробелы, одинарные кавычки, двойные кавычки или обратную косую черту, это не будет работать должным образом. grep
понимает это $i
как регулярное выражение . И даже если вы используете -F
или если эти строки не содержат операторов регулярных выражений (, таких как .
, $
... ), grep
будут искать эти строки в любом месте строки, не только в втором поле, не говоря уже о в точности как втором поле. Предполагая, что приведенный вами пример представляет собой одну строку в файле, вы можете использовать sed
, чтобы удалить все до и все после поля, которое вы хотите после:
sed -E 's/.*,("disconnectReason"="[0-9]+"),.*/\1/' <file>
Это "запоминает" поле и значение, которые вас интересуют, используя заключенное в скобки выражение sub -, а затем использует \1
для ссылки на первое (и только в этом случае )запомненное sub -выражение для замены строки while на.
Если вы действительно непреклонны в удалении двойных кавычек вокруг disconnectReason
, я бы сделал это с другим фильтром sed, вместо того, чтобы усложнять регулярное выражение. Возможно, он менее эффективен, но гораздо легче читается :
sed -E 's/.*,("disconnectReason"="[0-9]+"),.*/\1/' <file> |
sed -E 's/"(disconnectReason)"/\1/'
Много способов сделать это, основываясь на том, что вы сказали, этого должно быть достаточно для ваших нужд:
grep -oE '"disconnectReason"="[0-9]+"' yourfile
-o
указывает grep
вернуть только совпадающую часть строки