Найти заменить на sed с избытком кавычек - PullRequest
0 голосов
/ 16 октября 2018

Относительно Преобразование измерений высоты из британских единиц в метрические единицы , но с другим подходом.

У меня есть набор данных, в котором есть несколько значений со смешанными единицами, особенноизмерение высоты в имперских и метрических единицах.Кроме того, по какой-либо причине указанные имперские измерения содержат избыток кавычек.

Я думал, что вместо преобразования может сработать массовое нахождение-замена, поскольку высоты людей относительно ограничены.Например, у кого 5 '3 "- 160.02 см, так что можно просто найти все одно и заменить его другим.

Рассмотрим эту строку в наборе данных test.csv

"Female","Hispanic",25,"5' 11"""

Я хотел бы заменить "5 '11" "" на "180.34".

Я пробовал sed -i 's#"5' 1"""#"180.34"#g' test.csv, но единственный результат - это символ > в моем окне терминала,что говорит о том, что я сделал что-то не так, но не могу понять, что именно. Мне чего-то не хватает, чтобы справиться с лишними кавычками?

Ответы [ 4 ]

0 голосов
/ 16 октября 2018

по Additionally, for whatever reason, said Imperial measurements contain an excess of quotation marks. - при записи измерений в футах и ​​дюймах ' представляет футы, а " представляет дюймы.Итак, 5 футов 11 дюймов написано 5' 11".В CSV с полями в кавычках, таких как "foo", вам нужно каким-то образом включить ", и один из способов сделать это в некоторых форматах CSV (например, как экспортировано из Excel) - удвоить ", чтобы избежать его.Таким образом, включение foo"bar в поле в кавычках будет "foo""bar".Теперь давайте вернемся к 5' 11" - применяется та же логика, и, включив ее в поле в кавычках, вы бы записали его как "5' 11""", где "" перед последним " является экранированным представлением "для включения в указанное поле.См. Какой самый надежный способ эффективного анализа CSV с использованием awk? для ссылок на применимые "стандарты" CSV и дополнительную информацию о разборе CSV с помощью стандартного инструмента UNIX, awk.

относительно вашего конкретноговопрос - вместо того, чтобы конвертировать одно число за раз с использованием жестко закодированных значений, просто конвертируйте их все одновременно алгоритмически.Использование GNU awk для FPAT:

$ cat tst.awk
BEGIN {
    FPAT = "([^,]*)|(\"[^\"]+\")"
    OFS  = ","
}
{
   split($4,feetinches,/[^0-9]+/)
   ft = feetinches[2] + (feetinches[3] / 12)
   $4 = "\"" int( (10000 * ft / 3.28084) + 0.5 ) / 100 "\""
   print
}

$ cat file
"Female","Hispanic",25,"5' 11"""
"Male","Scottish",54,"6' 1"""
"Female","English",12,"4' 7"""
"TBD","Martian",935,"8' 5"""

$ awk -f tst.awk file
"Female","Hispanic",25,"180.34"
"Male","Scottish",54,"185.42"
"Female","English",12,"139.70"
"TBD","Martian",935,"256.54"
0 голосов
/ 16 октября 2018

Проблема в одиночной кавычке в выражении sed 5' 1.

Используйте \x27 для замены одинарных кавычек:

sed -i 's#"5\x27 1"""#"180.34"#g' test.csv
0 голосов
/ 16 октября 2018

Другой способ:

sed -i 's/5'"'"' 11""/180.34/g' test.csv
0 голосов
/ 16 октября 2018

проще всеготвой седон и спасайсяв этом случае:

sed -i "s|\"5' 1\"\"\"|\"180.34\"|g" test.csv
...