我正在尝试替换JSON字符串中的换行字符,因为Postgres的COPY函数将不起作用。
我一直在尝试sed的不同组合,例如:
gsed -z 's/\n/\\n/g'
gsed -E ':a;N;$!ba;s/r{0,1}n/\n/g'
gsed '/}$/{N; s/}n{/},n{/}
但是它要么替换它们全部,要么不替换。
下面是我的示例数据:
{"corpusid":75399585,"externalids":{"ACL":null,"DBLP":null,"ArXiv":null,"MAG":"2350229292","CorpusId":"75399585","PubMed":null,"DOI":null,"PubMedCentral":null},"url":"https://www.semanticscholar.org/paper/aec9799d6e12f2000deb8f7dadcc7d7e653f7393","title":"Prevention and Therapy of Osteoporosis","authors":[{"authorId":"40937034","name":"Hu Jun-bo"}],"venue":"","publicationvenueid":null,"year":2003,"referencecount":0,"citationcount":0,"influentialcitationcount":0,"isopenaccess":false,"s2fieldsofstudy":[{"category":"Medicine","source":"s2-fos-model"},{"category":"Medicine","source":"external"}],"publicationtypes":null,"publicationdate":null,"journal":null,"updated":"2022-02-11T07:19:53.877Z"}
{"corpusid":83138554,"openaccessinfo":{"externalids":{"MAG":"883546316","ACL":null,"DOI":null,"PubMedCentral":null,"ArXiv":null},"license":null,"url":null,"status":null},"abstract":"Phytosulfokin-alpha (PSK-alpha) ist ein bisulfatiertes Pentapetid, welches als Wachstumsfaktor die Proliferation von Zellen in Zellkultur niedriger Dichte stimuliert. In der vorliegenden Arbeit wurden physiologische und genetische Ansatze verfolgt, um Funktionen von PSK-alpha in Arabidopsis thaliana aufzuklaren. Promotor-GUS Expressionsanalysen der PSK-Praproproteingene und des PSK-Rezeptorgens AtPSKR1 in Wurzeln und Bluten deuteten auf mogliche Funktionen von PSK-alpha in diesen Geweben hin. nExogen appliziertes PSK-alpha forderte das Wurzelwachstum von Arabidopsiskeimlingen. Das Wurzelwachstum der PSK-Rezeptor T-DNA Insertionsmutante Atpskr1-T war inhibiert. Diese Ergebnisse zeigten, dass PSK-alpha in die Regulation von Wurzelwachstum involviert ist. nCharakteristisch fur die Atpskr1-T Mutante war eine verringerte Samenbildung im Vergleich zu Wildtyppflanzen. Genetische Analysen zeigten, dass sowohl ein paternaler als auch maternale Effekte und asynchrones Wachstum der inneren Blutenorgane zur Ausbildung des Mutantenphanotyps fuhren.","updated":"2022-02-11T01:27:48.987Z"}
可以看到,第二个JSON字符串在"抽象"中有n。字段,它需要被替换为\n
,我认为COPY工作。
但是我必须在JSON字符串之间保留换行符,因为有成千上万的换行符,以便COPY正确读取文件。
不使用sed
的解决方案:
head -n 1 file > new_file
tail -n 1 file | jq -c '.abstract |= (gsub("n"; "\n"))' >> new_file
我重用了Cyrus的jq部分,并将其包装到sh脚本中,因为我有许多需要转换的文件。请注意,它也将"
替换为"
,因为它阻止COPY功能正确导入JSON字符串。
结果如下:
#!/bin/bash
input_file=$1
output_file=$2
while read -r line; do
if echo "$line" | jq -e 'has("abstract")' > /dev/null; then
echo "$line" | jq -c 'try .abstract |= (gsub("\n"; "\n") | (gsub("""; """)))' | tee -a $output_file > /dev/null
else
echo "$line" | tee -a $output_file > /dev/null
fi
done < $input_file
tail -n 1 $input_file | jq -c 'try .abstract |= (gsub("\n"; "\n") | (gsub("""; """)))' >> $output_file
用法:
。/script_name.sh original_file。json converted_file.json