从文本文件转换数字

Convert number from text file

我有一个文件:

 id name date
 1  paul 23.07
 2  john 43.54
 3  marie 23.4
 4  alan  32.54
 5  patrick 32.1

我想打印以 "p" 开头且 ID 为奇数的名称

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

结果:

paul
patrick

来点 awk 怎么样?

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

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

只要记住基本模式即可:

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

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

awk -f script.awk filename

Awk 无所不能:

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

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

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

NR > 1
跳过 header

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

开头

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

如果以上都成立:
{ 打印 $2 }
打印名称字段

你可以试试这个

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 space。