Найти строку, содержащую строку, затем вернуть эту строку и все последующие строки текстового файла с помощью awk

Чтобы быть более надежным, вы можете выполнить полный разбор 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.

1
13.02.2020, 02:07
1 ответ

В 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

тоже должно работать.

3
28.04.2021, 23:23

Теги

Похожие вопросы