从带有序列号的文件中读取时

从带有序列号的文件中读取时

我想使用 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,读取第二行时,ID 应为 2`

答案1

尝试

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

在哪里

  • printf将跳过行、添加制表符和格式字符串。

对于id:参数,您可以使用示例文件中的第二个字段,或从行号(即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未格式化的原始文本读取为单个字符串。这会在换行符上分割成一个数组split("\n"),因为我们在数组末尾得到一个空值,所以我们将其删除.[0:-1](这会选择从第一个到第二个到最后一个的所有元素)。

使用与问题中相同的输入数据,我们现在有

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

$customer然后,我们使用每个元素和迭代器迭代该数组的值,并相应地使用和键.构造一个对象数组。nameid

结果是

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

相关内容