シリアル番号のあるファイルを読む場合

シリアル番号のあるファイルを読む場合

echoコマンドを使ってファイルに書きたいです。 echo コマンドは他のファイルからデータを取得します。

これはエココマンドです:

echo '{
       name: $name
       id: $seq
       }

txtファイルがあります。

customer 1
customer 2
customer 3

そのため、ファイルを生成し、echoを実行し、txtファイルの最初の行で$ nameを置き換えようとします。

次に、$ seqの先頭を1に置き換えます。

私が欲しいファイルです。

{
       name: customer 1
       id: 1
       }
{
       name: customer 2
       id: 2
       }
{
       name: customer 3
       id: 3
       }

最初の行を読むときはIDは1でなければならず、2行目を読むときはIDは2でなければなりません。

答え1

努力する

 awk '{printf "{\n\tname: %s\n\tid: %d\n\t}\n",$0,NR}' file.txt

どこ

  • printf行をスキップし、タブとフォーマット文字列を追加します。

パラメータの場合、id:サンプルファイルの2番目のフィールドを使用するか、行番号NR(つまり(レコード数)値)からフィールドを生成できます。

答え2

正しいJSON形式の出力が必要な場合:

jq -Rs 'split("\n") |
        .[0:-1]     |
        [ foreach .[] as $customer ( 0; .+1; { name: $customer, id: . } ) ]' ./file

またはより短く、

$ jq -Rs '[ foreach split("\n")[0:-1][] as $customer ( 0; .+1; { name: $customer, id: . } ) ]' ./file

-Rsフォーマットされていない生のテキストを単一の文字列として読み込みます。これは newlines で配列を分割しsplit("\n")、配列の末尾に null 値があるため、これを削除します.[0:-1](これにより、最初から2番目、最後まですべての要素が選択されます)。

質問と同じ入力データを使用して、

[
  "customer 1",
  "customer 2",
  "customer 3"
]

$customer次に、各要素とイテレータを使用してその配列の値を繰り返し、それに応じてキーを使用して.オブジェクトの配列を構築します。nameid

明らかにする

[
  {
    "name": "customer 1",
    "id": 1
  },
  {
    "name": "customer 2",
    "id": 2
  },
  {
    "name": "customer 3",
    "id": 3
  }
]

関連情報