![순수 데이터를 json 파일로 변환](https://linux55.com/image/113150/%EC%88%9C%EC%88%98%20%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%A5%BC%20json%20%ED%8C%8C%EC%9D%BC%EB%A1%9C%20%EB%B3%80%ED%99%98.png)
모든 사람. 저는 Linux를 처음 접했고 이 사이트를 읽으면서 많은 것을 배웠습니다. 제 회계 프로그램에 문제가 있어서 다시 말씀드립니다. 데이터를 일반 텍스트에서 json으로 옮기고 싶습니다. 이렇게 하면 더 나은 결과와 더 많은 유연성을 얻을 수 있다고 믿습니다.
별도의 파일에 정보가 포함된 폴더가 있습니다. 파일은 다음과 같습니다.
20170404
pago
80051442-4
002-001-0080057
310000
310000
si
2017-06-05
이 정보를 각 행이 새로운 json 필드인 새 파일에 복사하고 싶습니다. 이 같은:
{
"field1":"20170404",
"field2":"pago",
"field3":"80051442-4",
"field4":"002-001-0080057",
"field5":"310000"
"field6":"",
"field7":"";
"field8":"310000"
"field9":"si"
"field10":"2017-06-05"
}
전체 디렉터리를 읽고 oldfile.json이라는 새 파일을 빌드하는 스크립트를 찾고 있습니다.
그런 다음 이러한 여러 파일의 결과를 다른 열에 표시하고 싶습니다.
file1 field1 field2 field3 field4 field5 field6 field7
file2 field1 field2 field3 field4 field5 field6 field7
file3 field1 field2 field3 field4 field5 field6 field7
file4 field1 field2 field3 field4 field5 field6 field7
file5 field1 field2 field3 field4 field5 field6 field7
시간을 내주셔서 감사합니다.
답변1
나는 다음을 사용하여 이 문제를 해결할 것입니다.잭도구(적절한 JSON 구문 분석/조작 도구):
for f in *; do
jq -R -s 'rtrimstr("\n") | split("\n") | to_entries | reduce .[] as $o ({}; .["field" + ($o.key+1|tostring)] |= $o.value )' "$f" > "$f".json;
done
-R
( )와 ( ) 결합--raw-input
- 전체 입력을 하나의 긴 문자열로 필터에 전달합니다.-s
--slurp
답변2
for file in *; do
awk 'BEGIN { print "{" } END { print "\n}" } { printf( "%s",newrec); printf( "\"field%d\": \"%s\"", NR, $0); newrec=",\n" }' "$file" > "${file}.json"
done
NR
지금까지 처리된 파일의 레코드(또는 행) 수입니다. 1
첫 번째 행, 두 번째 행 등을 작업할 때 이런 일이 발생합니다.2
$0
수정되지 않은 전체 입력 레코드(또는 행)입니다.
필드의 이름이 같은 경우 labels[]
섹션에서 배열을 정의한 BEGIN
다음(예:) 인덱스로 참조할 수 있습니다(예: labels[NR]
).
답변3
파트 2에 대한 답변 - json 파일을 테이블로 변환합니다.
용법: ./json_to_table.sh *.json
#!/bin/bash
for i in "$@"; do
file_content=$(sed -n 's/".*":"\(.*\)",\?/\1/p' "$i" | tr '\n' ' ')
printf "%s %s\n" "$i" "$file_content"
done | column -t
멋진 표 형식이 필요하지 않으면 | column -t
섹션을 삭제할 수 있습니다(하단, 다음 done
). 그러면 행의 필드가 공백으로 구분되므로 각 필드는 고유한 너비를 갖게 됩니다. awk
예 를 들어 프로그램 구문 분석에는 좋지만 sed
사람이 읽는 데는 편리하지 않습니다.
노트:json 파일의 각 레코드 뒤에는 쉼표가 있어야 합니다(마지막 레코드 제외). 내가 말하고 싶은 건:
"field8":"310000", <- here
"field9":"si", <-here
"field10":"2017-06-05" <- not here. Last record without comma.
}
답변4
따라서 첫 번째 부분의 최종 스크립트는 다음과 같습니다.
for file in facturas/*; do
awk 'BEGIN {
split("fechae tpago ruc nfactura total iva10 iva5 iva0 archivado fechap",campos)
print "{"
}
END {
print "\n}"
}
{
printf( "%s",newrec)
printf( "\"%s\":\"%s\"", campos[NR], $0)
newrec=",\n"
}' "$file" > "${file}.json"
done
2부의 최종 결과:
#!/bin/bash
for i in "$@"; do
printf "%s " "$i"
sed -n 's/".*":"\(.*\)"/\1/p' "$i" | tr ',\n' ' '
echo
done | column -t
관심을 가져주셔서 감사합니다.