한 파일의 내용을 다른 파일로 출력하려면 while 루프를 만들어 보세요.

한 파일의 내용을 다른 파일로 출력하려면 while 루프를 만들어 보세요.

한 파일에서 콘텐츠를 가져오고 다른 파일에 일부 콘텐츠를 생성하도록 while 루프를 만들려고 합니다. 그러나 나는 파일의 모든 줄이 아닌 파일의 마지막 줄만 생성한다는 것을 알았습니다. 내가 여기서 무엇을 놓치고 있는 걸까요? 아니면 내 에코 방법이 잘못 되었나요?

"test"라는 이름의 내 파일에는 문자열 목록이 포함되어 있습니다.

unix_idx
web_pn_iis
wis_healthpartners

다음 명령을 사용하여 while 루프를 만들려고 합니다.

while read -r line;
do
echo "  {
    \"name\": \"$line\",  
    \"datatype\": \"event\", 
    \"searchableDays\": 180, 
    \"maxDataSizeMB\": 0, 
    \"totalEventCount\": \"0\", 
    \"totalRawSizeMB\": \"0\" 
    }," > myfile.json;
done < test;

그러나 명령이 실행되면 myfile.json에는 테스트 파일에서 읽은 마지막 줄만 포함됩니다. 즉, wis_healthpartners

  {
"name": "wis_healthpartners",  
"datatype": "event", 
"searchableDays": 180, 
"maxDataSizeMB": 0, 
"totalEventCount": "0", 
"totalRawSizeMB": "0" 
},

그래서 while 루프가 실행되는 동안 에코가 작성되었고 마지막 줄만 남았다고 생각합니다. 모든 행을 포함하도록 어떻게 조정합니까? 내가 원하는 출력은 다음과 같습니다.

{
  "name": "unix_idx",
  "datatype": "event",
  "searchableDays": 180,
  "maxDataSizeMB": 0,
  "totalEventCount": "0",
  "totalRawSizeMB": "0"
},
{
  "name": "web_pn_iis",
  "datatype": "event",
  "searchableDays": 180,
  "maxDataSizeMB": 0,
  "totalEventCount": "0",
  "totalRawSizeMB": "0"
},
{
  "name": "wis_healthpartners",
  "datatype": "event",
  "searchableDays": 180,
  "maxDataSizeMB": 0,
  "totalEventCount": "0",
  "totalRawSizeMB": "0"

},

답변1

Bash에서 >운영자는 운영자가 추가하는 동안 파일의 기존 데이터를 의도적으로 덮어씁니다 >>.

시작하기 전에 파일이 비어 있는지 확인해야 하는 경우 printf "" > myfile.json루프가 실행되기 전에 파일을 지운 다음 >>끝까지 계속 쓰기를 사용할 수 있습니다.

답변2

테스트 파일의 항목이 올바르게 인용된 경우 JSON 문자열

$ cat test
"unix_idx"
"web_pn_iis"
"wis_healthpartners"

그런 다음 jq이를 --slurpfile배열로 끌어오고 반복하여 다음을 사용하여 템플릿 JSON 파일에서 개체 배열을 만들 수 있습니다.

{
  "name": "",
  "datatype": "event",
  "searchableDays": 180,
  "maxDataSizeMB": 0,
  "totalEventCount": "0",
  "totalRawSizeMB": "0"
}

전임자.

$ jq --slurpfile names test '
    . | [foreach $names[] as $name (.; .name |= $name)]' template.json
[
  {
    "name": "unix_idx",
    "datatype": "event",
    "searchableDays": 180,
    "maxDataSizeMB": 0,
    "totalEventCount": "0",
    "totalRawSizeMB": "0"
  },
  {
    "name": "web_pn_iis",
    "datatype": "event",
    "searchableDays": 180,
    "maxDataSizeMB": 0,
    "totalEventCount": "0",
    "totalRawSizeMB": "0"
  },
  {
    "name": "wis_healthpartners",
    "datatype": "event",
    "searchableDays": 180,
    "maxDataSizeMB": 0,
    "totalEventCount": "0",
    "totalRawSizeMB": "0"
  }
]

인용되지 않은 요소를 사용해야 하는 경우에는 --rawfile작업이 더 많지만 동일한 작업을 수행할 수 있습니다.

jq --rawfile names test '
    . | [foreach ($names | split("\n")[0:-1] | .[]) as $name (.; .name |= $name)]
' template.json

이 슬라이싱은 [0:-1]파일의 후행 줄 바꿈이 추가 빈 요소를 나타내는 것으로 split("\n")해석되기 때문에 필요합니다.test

관련 정보