Как удалить значение третьего столбца, из четвертого столбца, если он существует, в CSV-файл? - PullRequest
0 голосов
/ 01 мая 2019

Ubuntu 16.04 Bash 4.3.48

Я хочу удалить значение столбца 3 из столбца 4, если оно существует, включая пробел после значения.

Before: "Acura","CL","2.2","2.2 2dr Coupe","FWD","Automatic","Gasoline"
After:  "Acura","CL","2.2","2dr Coupe","FWD","Automatic","Gasoline"

Before: "Acura","CL","2.2 Premium","2.2 Premium 2dr Coupe","FWD","Manual","Gasoline"
After:  "Acura","CL","2.2 Premium","2dr Coupe","FWD","Manual","Gasoline"   

Я пытался использовать awkкак предложено:

root@0000 ~ # awk 'BEGIN{FS=OFS=","} {sub($3,"",$4)} 1' data-one-makes-models.csv > temp; head -n5 temp
"make","model","trim","style","drivetrain","transmission","fueltype"
"Acura","CL","2.2","2.2 2dr Coupe","FWD","Automatic","Gasoline"
"Acura","CL","2.2","2.2 2dr Coupe","FWD","Manual","Gasoline"
"Acura","CL","2.2 Premium","2.2 Premium 2dr Coupe","FWD","Automatic","Gasoline"
"Acura","CL","2.2 Premium","2.2 Premium 2dr Coupe","FWD","Manual","Gasoline"  

Правильно ли я перенаправил вывод или мне нужно реструктурировать команду?

Ответы [ 2 ]

3 голосов
/ 01 мая 2019

В вашем коде вы используете , в качестве разделителя, но ваши поля фактически разделены ",", поэтому просто измените настройки FS и OFS, чтобы они соответствовали вашим данным:

$ awk 'BEGIN{FS=OFS="\",\""} {sub($3,"",$4)} 1' file
"Acura","CL","2.2"," 2dr Coupe","FWD","Automatic","Gasoline"
"Acura","CL","2.2 Premium"," 2dr Coupe","FWD","Manual","Gasoline"

и чтобы избавиться от пробела, оставшегося в начале $ 4, включите пробелы в регулярное выражение:

$ awk 'BEGIN{FS=OFS="\",\""} {sub($3" *","",$4)} 1' file
"Acura","CL","2.2","2dr Coupe","FWD","Automatic","Gasoline"
"Acura","CL","2.2 Premium","2dr Coupe","FWD","Manual","Gasoline"

Это не надежно, хотя из-за использования $ 3 в качестве регулярного выражения, поэтому метасхемы RE, такие как ., будут обрабатываться следующим образом:

$ echo '"Acura","CL","2.2","Big 12324 Coupe","FWD","Automatic","Gasoline"' |
    awk 'BEGIN{FS=OFS="\",\""} {sub($3,"",$4)} 1'
"Acura","CL","2.2","Big 14 Coupe","FWD","Automatic","Gasoline"

Для того, чтобы это работало надежно, вы должны выполнять строковые, а не регулярные выражения:

$ awk 'BEGIN{FS=OFS="\",\""} s=index($4,$3){$4=substr($4,1,s-1) substr($4,s+length($3)); gsub(/ +/," ",$4); gsub(/^ | $/,"",$4)} 1' file
"Acura","CL","2.2","2dr Coupe","FWD","Automatic","Gasoline"
"Acura","CL","2.2 Premium","2dr Coupe","FWD","Manual","Gasoline"

и если вы хотите удалить только $ 3, если это происходит в начале $ 4, просто измените s=index($4,$3) на (s=index($4,$3))==1.

2 голосов
/ 01 мая 2019

Не могли бы вы попробовать следующее (написано и протестировано только с показанными образцами).

awk 'BEGIN{FS=OFS=","} {val=$3;gsub(/\"/,"",val);sub(val,"",$4);sub(/^" /,"\"",$4)} 1' Input_file
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...