【问题标题】:Copying certain words from one file to another using command line使用命令行将某些单词从一个文件复制到另一个文件
【发布时间】:2013-11-19 12:59:00
【问题描述】:

我有一个格式如下的文本文件:

{
Name: Me
Age:17
Qualification : Doctor
}
{
 Name: You
 Age:21
 Qualification : Another Doctor
}

我需要将 Age 行中的数字(在这种情况下为“17”和“21”)复制到另一个采用这种格式的文件中:

17,21.

如您所见,我正在尝试为文件 1 中某个字段中的数字创建文件 2 CSV。我需要使用 shell 脚本自动执行此操作。请提出解决方案。

当我在 Google 上搜索时,出现了“sed”选项,但我找不到解决此问题的紧凑方案。

提前感谢您的时间和贡献。

【问题讨论】:

  • 感谢您编辑 devnull。

标签: linux command-line sed


【解决方案1】:

像这样的?

awk -F: '/Age/ {printf "%s,",$2} END {print ""}' file1 >agefile
cat agefile
17,21,

【讨论】:

    【解决方案2】:

    以下是 Jotne 回复的一个变体,其中包含整理好的尾随逗号:

    awk -F: '/Age:/{r=r $2 ","}END{sub(/,$/,"",r);print r}' a
    17,21
    

    基本上,它通过查找包含“Age”的行,然后在该行上附加第二个字段并随后添加一个逗号,在变量“r”中构建一个结果字符串。最后,它将尾随逗号(在行尾)替换为空,然后打印结果字符串“r”。

    【讨论】:

    • 谢谢马克的详细回答。我选择了 Jotne 的答案,因为它对我有用。但我也会尝试这个解决方案,以便在命令行中了解更多关于 awk 的信息。
    【解决方案3】:

    这可能对你有用(GNU sed):

    sed '/\s*Age:\s*/H;$!d;x;s///;s//,/g' file
    

    这会将带有Age: 的行附加到保留空间(HS)并删除其他所有内容。在文件结束时,它会切换到 HS 并删除不需要的文本,将其替换为 ,'s。

    【讨论】:

      【解决方案4】:
      @ECHO OFF
      SETLOCAL
      SET "number1="
      (
       FOR /f "tokens=1,2delims=: " %%a IN (q20072209.txt) DO IF "%%a"=="Age" (
        IF DEFINED number1 (
         CALL ECHO %%number1%%,%%b.
         SET "number1="
         ) ELSE SET number1=%%b
       )
      )>newfile.txt
      TYPE newfile.txt
      GOTO :EOF
      

      完全不确定如果有超过 1 对数据元素会发生什么。 q20072209.txt 是输入文本文件的名称,newfile.txt 将被生成。

      【讨论】:

      • 感谢 Magoo 的回答。 Jotne 的解决方案对我有用,但我也会对此进行测试,看看它是否更合适。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-12-20
      • 1970-01-01
      • 1970-01-01
      • 2011-05-19
      • 2021-09-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多