我想分隔第二列中的值小于特定值的那些行。
输入示例:
id1 19501112
id2 19831207
id3 20001212
id6 20000101
id10 20061213
id11 20081212
id12 20100109
id13 20101218
id14 20101212
id15 20111111
id16 20150919
id20 20141415
我想提取第二个字段的值小于 20100101 的行。因此,我的输出将是:
id1 19501112
id2 19831207
id3 20001212
id6 20000101
id10 20061213
id11 20081212
有什么建议吗?
答案1
$ awk '$2<20100101' file
id1 19501112
id2 19831207
1d3 20001212
id6 20000101
id10 20061213
id11 20081212
典型的 awk 程序由如下命令组成:
condition { action }
在我们的例子中,状况是第二列小于20100101。这状况足够合理地写为$2<20100101
.因为我们不提供行动,awk 执行默认操作,即打印该行。
答案2
Perl 方法:
perl -ane 'print if $F[1]<20100101' file
逐行-n
读取输入文件并应用 给定的脚本-e
。其-a
行为perl
就像awk
,它会自动在空格上分割每个输入行并将每个字段保存为数组的元素@F
。因此,如果第二个字段(F[1]
数组从 0 开始)小于 20100101,脚本本身将打印一行。
答案3
外壳版本:
(while read l; do [ `echo $l | cut -d ' ' -f 2` -lt 20100101 ] && echo $l; done) < file
答案4
对于案例 2,这可以在 Bash 中完成,例如将下面的文件保存为分裂:
#!/usr/bin/env bash
# Usage: ./split 'data.txt' 'value'
paired=( )
value="$2"
while read -a paired
do
[[ ${paired[1]} < $value ]] &&
echo "${paired[@]}" >> lessthan.txt ||
echo "${paired[@]}" >> morethan.txt
done < "$1"
# end file
请注意,变量配对的是一个数组。使用读-配对将每一行读入一个从零开始的成对数组中,因此元素 1 是每行中感兴趣的数字。参数 2 至分裂是用于分割的值。
对于您的情况 1,我不确定您想要做什么,但您可以修改上述内容,以便在阅读文件的每一行时,您可以将第 1 列${paired[0]}
或第 2 列发送${paired[1]}
到您希望的任何文件,具体取决于第 2 列的值。