2017-11-24 1 views
1

때까지 형식을 다음 반복파일에 첫 번째 줄을 읽고 검색 문자열의 첫 번째 항목에 추가 내가 텍스트 파일에서 다음 줄을 가진 파일이 EOF

"abc": "xyz", 
"qwe": "uva", 
"asd": "lkj", 

그리고 다음에 JSON 파일 이 사용 BAS를 달성 할 수있는 방법 그래서

{ 
     "svn-user-id": "passwd" 
     "solution-id": 0, 
     "abc": "xyz", 
     "cronos-id": "1", 
     "solution-state": "active", 
     }, 
    { 
     "svn-user-id": "passwd" 
     "solution-id": 1, 
     "qwe": "uva", 
     "cronos-id": "1", 
     "solution-state": "active", 
     }, 
    { 
     "svn-user-id": "passwd" 
     "solution-id": 2, 
     "asd": "lkj", 
     "cronos-id": "1", 
     "solution-state": "active", 
     }, 

을 다음과 같이 형식

{ 
    "svn-user-id": "passwd" 
    "solution-id": 0, 
    "cronos-id": "1", 
    "solution-state": "active", 
    }, 
{ 
    "svn-user-id": "passwd" 
    "solution-id": 1, 
    "cronos-id": "1", 
    "solution-state": "active", 
    }, 
{ 
    "svn-user-id": "passwd" 
    "solution-id": 2, 
    "cronos-id": "1", 
    "solution-state": "active", 
    }, 

지금 내가 JSON의 출력을 원하는 h?

나는 다음과 같이 시도했지만 파일의 마지막 줄만 추가합니다.

#!/bin/bash 
set -x 
file=names.txt #file has list of lines as described above 
IFS=$'\n' 

for l in `cat $file` 
     do 
     echo $l 
     sed '/"solution-id": 1,/a \'"$l"'' sample.json # json file as described above 
     done 
+2

'jq' [here] (https://stedolan.github.io/jq/)를보십시오. 꽤 유용 할 수 있습니다. – NullDev

+1

이것은 유효한 JSON 파일이 아니며 첫 번째 파일의 형식은 다른 JSON 파일에서 추출 된 형식임을 나타냅니다. 이 발췌문보다는 원본 파일로 시작하는 것이 더 간단 할 수 있습니다. – chepner

답변

1

이 그것을 할 것입니다 :

#!/bin/bash 
#set -x 
IFS=$'\n' 

declare -a names 
names=(`cat names.txt`) 

for l in `cat sample.json` 
do 
    echo $l 
    echo $l | grep -P -q solution-id 
    if [ $? -eq 0 ] 
    then 
     echo " ${names[$i]}" 
     let "i+=1" 
    fi 
done 
+0

고마워요 @PiedPiper. 이것은 잘 작동합니다. – hruday

+0

json 파일에 더 많은 항목이 있고 파일의 줄을 다시 시작해야하는 경우 어떻게해야합니까? – hruday

+0

배열의 길이를 $ {# names [@]}로 얻을 수 있습니다. '$ i'가 커지면 0으로 리셋됩니다. – PiedPiper

0

당신의 solution-id 식별자가 여기에 귀하의 파일 순서와 일치하는 경우는 당신이 필요 않는 코드입니다 :

#!/usr/bin/env bash 

x=0 
cp sample.json tmp.json 
while read l 
    do 
    sed -i "/\"solution-id\": ${x},/a ${l}" tmp.json 
    x=$(($x + 1)) 
    done < names.txt 

cat tmp.json 

그것은 복사하여 입력 파일과에서 장소에 교체하고 인쇄를 나오지도 수행 종료.

+0

스크립트는 각 검색 문자열에 첫 줄만 추가합니다. 실제로는 첫 번째 발생시 첫 번째 줄, 두 번째 발생시 두 번째 줄, 세 번째 발생시 세 번째 줄 등과 같아야합니다. EOF까지 계속됩니다. – hruday

+0

@hruday이 작품은 나를 위해 – PiedPiper

0

이 당신을 위해 작동 할 수 있습니다 (GNU는 나오지도) :

sed 's/^/ /' textFile | sed '/solution-id/R /dev/stdin' jsonFile 

앞에 추가 4 개 공간을 텍스트 파일 및 파이프 라인을 추가 나오지도의 두 번째 호출 (하나 결과의 각 행에 한 번에) 문자열을 solution-id과 일치시킬 때 json 파일에 추가하십시오.

1

당신은이 라인을 추가 awk를 사용할 수 있습니다. 명령은 추가 경기에 빈 줄을 인쇄 할 수 위의

awk 'FNR==NR{a[NR]=$0; next} /solution-id/{$0=$0 "\n\t" a[++i]} 1' lines file 


이 경우 파일의 일치, 라인 이상입니다. 혹시 라인 돌이 필요하고이 같은 예를 들어, 처음부터 i 다시 시작을해야 할 모든 일치하는 새 줄을 인쇄 :

awk 'FNR==NR{a[NR]=$0; next} /solution-id/{$0=$0 "\n\t" a[i++%length(a)+1]} 1' lines file 


참고 : 이미 주석, 귀하의 의견은 올바른 JSON이 아닌 경우 텍스트 처리 JSON 파일에서 추출한 것일 수 있습니다. 초기 입력을 JSON으로 처리해야하는 경우 JSON 처리 도구를 사용해야합니다.

관련 문제