grep -E '(".+",){4}".+"' Csv.file
"linux02","cluster26","api2-thrift-apiconf","api.driver.memory","2"
"linux02","cluster26","api2-thrift-apiconf","api.executor.cores","2"
"linux02","cluster26","api2-thrift-apiconf","api.executor.instances","2"
"linux02","cluster26","api2-thrift-apiconf","api.executor.memory","2"
"linux02","cluster26","api2-thrift-apiconf","api.sql.shuffle.partitions","141"
"linux02","cluster26","api2-thrift-apiconf","api.dynamicAllocation.enabled","true"
"linux02","cluster26","api2-thrift-apiconf","api.driver.memory","api2-thrift-apiconf","api.executor.memory"
-E
будет использовать расширенное регулярное выражение, которое вы ищете 4 раза для ".+",
и добавляете один раз для ".+"
. Но все же вы должны были предоставить немного того, что вы пробовали.
Примечание:Я использовал .+
для поиска непустой строки, если вам нужна строка с 5 полями, даже пустая, замените +
на*
:
grep -E '(".*",){4}".*"' Csv.file
Предполагая, что вы ДЕЙСТВИТЕЛЬНО не хотите явно сопоставлять ID
, а просто хотите, чтобы первое поле печаталось, когда есть любое другое поле, которое соответствуетmatch
:
$ awk '{c=0; for (i=2;i<=NF;i++) if ($i ~ /^match/) printf "%s%s%s", (c++ ? "" : $1), OFS, $i} c{print ""}' file
ID1 match1
ID2 match2 matchABC
Попробуйте также
awk '{for (i=1; i<=NF; i++) if ($i !~ /match|ID/) $i=""} 1' file1
ID1 match1
ID2 match2 matchABC