Чтобы быть более надежным, вы можете выполнить полный разбор json:
perl -0777 -pe '
s@(".*?"|\\)|(\{(?:"(?:\\.|[^"])*+"|(?2)|[^"{}]++)*+\})|[^{}\\"]+@
$1 ? $1 =~ s/["\\]/\\$&/gr : $&@gse'
Который на входе вида
"a" "b" "c{d"
{"1":"female","2":"197312","3":"359","4":"201109","5":"mail"}
{
"1": {"x": "y"}
"2": "}}}"
"3": ["{\"x", "}"]
}
\uff08\u524d\u5bfe\u5fdc
дает
\"a\" \"b\" \"c{d\"
{"1":"female","2":"197312","3":"359","4":"201109","5":"mail"}
{
"1": {"x": "y"}
"2": "}}}"
"3": ["{\"x", "}"]
}
\\uff08\\u524d\\u5bfe\\u5fdc
Вы можете уточнить, что вы хотите сделать, если входные данные содержат "foo\"bar"
или "foo\nbar"
вне объектов json.
В awk $r
будет относиться к значению r
-гополя , а не к значению самого r
. Ваше решение должно работать, если вы просто замените $r
наr
:
awk -F, -v r=$SID '{ if (NR >= r) print $0}' data.csv
или (более идиоматично, используя действие печати по умолчанию )
awk -F, -v r=$SID 'NR >= r' data.csv
Однако на самом деле нет необходимости делать это в два этапа -или
awk -F, '$1 == "SAMPLE ID" {p=1} p' data.csv
или даже (полное игнорирование структуры CSV)
awk '/^SAMPLE ID,/{p=1} p' data.csv
тоже должно работать.