Чтобы сделать это надежно, просто:
$ awk 'BEGIN{FS=OFS=","} $1=="AA"{$4="ZZ"} 1' csv
AA,1,CC,ZZ,EE
AA,FF,6,ZZ,8,9
BB,6,7,8,99,AA
Обратите внимание, что в приведенном выше примере выполняется сравнение буквенных строк и замена буквенных строк, поэтому в отличие от других опубликованных решений, он не потерпит неудачу, если целевая строка (AA
в этом примере) содержит метасхемы регулярного выражения, такие как .
или *
, или если она может быть частью другой строки, такой как AAX
, или если строка замены (ZZ
в этом примере) содержит обратные ссылки, такие как &
или \1
.
Если вы хотите отобразить несколько строк за один проход:
$ awk 'BEGIN{FS=OFS=","; m["AA"]="ZZ"; m["BB"]="FOO"} $1 in m{$4=m[$1]} 1' csv
AA,1,CC,ZZ,EE
AA,FF,6,ZZ,8,9
BB,6,7,FOO,99,AA
и точно так же, как GNU sed имеет -i
для редактирования на месте, GNU awk имеет -i inplace
, так что вы можете отказаться от цикла оболочки и просто сделать:
awk -i inplace '
BEGIN { FS=OFS="," }
(NR==FNR) { ARGV[ARGC++]=$0 }
(NR!=FNR) && ($1=="AA") { $4="ZZ" }
{ print }
' file
и он будет работать со всеми файлами, указанными в file
, за один вызов awk. «file» в последнем случае - это ваш файл, содержащий список других имен файлов CSV.