如何根据Linux中列中的信息拆分文件

如何根据Linux中列中的信息拆分文件

我想分隔第二列中的值小于特定值的那些行。

输入示例:

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 列的值。

相关内容