【问题标题】:Convert number from text file从文本文件转换数字
【发布时间】:2016-03-09 14:59:22
【问题描述】:

我有一个文件:

身份证姓名日期 1 保罗 23.07 2 约翰 43.54 3 玛丽 23.4 4艾伦32.54 5 帕特里克 32.1

我想打印以“p”开头并具有奇数 id 的名称

我的命令: grep "^p" filename | cut -d ' ' -f 2 | ....

结果:

保罗 帕特里克

【问题讨论】:

  • 欢迎来到 StackOverflow paulc!是您从命令中显示的结果还是您想要的结果?除了....,你的命令还有什么?很高兴为您提供帮助,但不确定您要去哪里。就个人而言,我建议在 awk 中执行此操作。

标签: linux bash awk grep cut


【解决方案1】:

Awk 无所不能:

$ awk 'NR > 1 && $2 ~ /^p/ && ($1 % 2) == 1 { print $2 }' op.txt
paul
patrick

编辑
使用: 作为字段分隔符:

$ awk -F: 'NR > 1 && $2 ~ /^p/ && ($1 % 2) == 1 { print $2 }' op.txt

NR > 1
跳过标题

$2 ~ /^p/
名称字段以 p 开头

$1 % 2 == 1
ID 字段为奇数

如果以上所有条件都成立:
{ print $2 }
打印名称字段

【讨论】:

  • 您不需要==1 也不需要检查它是否不是第一行,因为第一行没有数字作为第一个字段。
  • 但如果归档分隔符是例如“:”?
  • 您只需将代码包含在完整的块中,就像我在下面的答案中指出的那样:awk 'BEGIN {FS=":"} { … }' filename
【解决方案2】:

来一点 awk 怎么样?

awk '{if ($1 % 2 == 1 && substr($2, 1, 1) == "p") print $2}' filename

在 awk 中,字段默认由spaces, tabs and newlines 分割,因此您的 id 可用 $1,名称为 $2 等。if 是不言自明的,当条件为 true 时,将打印出名称,否则什么都没做。 AWK 及其语法比人们通常想象的要友好得多。

只要记住基本模式:

BEGIN {
    # ran once in the beginning
}
{
    # done for each line
}
END {
    # ran once in the end
}

如果你需要更复杂的解析,你可以在一个单独的文件中保持脚本清晰可读,这样调用它:

awk -f script.awk filename

【讨论】:

  • awk '$1%2&&$2~/^p/{print $2}'
  • 只是为了澄清一下,空格 FS 是隐含的,但我会将它留在答案中,以防您需要按制表符拆分字段。我也喜欢其他人的简短解决方案。 :-)
  • 虽然不需要在其他字段上拆分,但如果您要放入冗余 FS,您不妨设置每个环境变量以“以防万一”。
  • 没错,我也刚刚发现选项卡也是隐式的。谢谢!
【解决方案3】:

你可以试试这个

grep -e "[0-9]*[13579]\s\+p[a-z]\+" -o text | tr -s ' ' | cut -d ' ' -f 2

奇数很容易用正则表达式表示,我们在这里写

[0-9]*[13579]

如果您尝试使用示例文件名 text 运行此命令

文件:文本

 id name date
 1  paul 23.07
 2  john 43.54
 3  marie 23.4
 5  patrick 32.1
38  peter 21.44
10019  peyton 12.02

你会得到输出:

paul
patrick
peyton

请注意,tr -s ' ' 用于确保您的分隔符始终为 1 个空格。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-17
    • 2017-11-08
    相关资源
    最近更新 更多