【问题标题】:extract the row of the text files based on minimum value in the column根据列中的最小值提取文本文件的行
【发布时间】:2020-09-30 00:31:24
【问题描述】:

我在目录中有许多文本文件(.txt)文件,其中包含 5 列作为下面给出的示例数据:

data1.txt

/home/lijun/data   1.0  2.0 5.0 1.0 
/home/lijun/data   1.0  2.0 5.0 0.5 
/home/lijun/data   1.0  2.0 5.0 2.3 
/home/lijun/data   1.0  2.0 5.0 1.9 
/home/lijun/data   1.0  2.0 5.0 1.1 
/home/lijun/data   1.0  2.0 5.0 1.5

我需要提取第 5 列中包含最小值的行

/home/lijun/data   1.0  2.0 5.0 0.5 

然后我想将提取的文件以相同的文件名保存在另一个新目录/home/lijun/new_data/data1.txt

我尝试了下面的代码来做同样的事情,但它没有显示任何结果...希望专家提供一些结果。谢谢。

#!/bin/sh
for file in /home/lijun/data/*.txt
do
awk '{if $5=min}' $file
done

【问题讨论】:

    标签: bash for-loop awk


    【解决方案1】:

    你可以这样做:

    for file in /home/lijun/old_data/*.txt; do
        cp "$(sort -n -k 5,5 "$file" | head -n 1 | cut -f 1)" /home/lijun/new_data/
    done
    

    -n 标志用于数字排序,-k 5,5 用于按第 5 列排序(默认由空格分隔)。 head -n 1 只占用第一行。 cut -f 1 提取文件名。这一切都包含在命令替换 $() 中,用于复制命令。

    【讨论】:

    【解决方案2】:

    您可以通过简单地使用awk 来大大提高您如何隔离具有最小第五个字段的记录并将其写入newdata 子目录的效率。一个处理整个事件的单一进程。

    使用awk,您只需声明一个变量i,并将其设置为大于您拥有的最大最小值。由于 C 中没有与 INT_MAX 等价的变量,因此您可以简单地将变量值设置为一个很大的数字(一百万以下)。然后你只需循环比较第五个字段和变量,如果第五个字段小于,则将其保存为新变量值并将记录(行)存储在另一个中。

    您使用文件记录号FNR 来检查您是否正在处理文件中的第一行。如果是这样,将文件名保存为最后看到的文件名(例如lastfn)。要控制输出,您将检查是否有最低记录保存。如果是这样,那么lasfn 将保存当前最小记录的文件名,您可以将其重定向到相同文件名中的newdata 目录。然后在END规则中,只需将保存的记录输出并重定向到newdata目录下的同名新文件即可。

    更改到包含所有*.txt 文件的目录并创建newdata 目录,例如(mkdir -p newdata);那么:

    你可以做一个单行:

    awk 'FNR==1 {if (lastfn) print rec > "newdata/" lastfn; lastfn=FILENAME; i=100000} {if ($5<i) {i=$5;rec=$0}} END {print rec > "newdata/" FILENAME}' *.txt
    

    或者是多行格式,可以是可读的,例如

    awk 'FNR==1 {
        if (lastfn)
            print rec > "newdata/" lastfn
            lastfn = FILENAME
            i = 100000
    }
    {
        if ($5 < i) {
            i = $5
            rec = $0
        }
    }
    END {
        print rec > "newdata/" FILENAME
    }' *.txt
    

    示例输出

    在您会发现的newdata 目录中创建:

    $ cat newdata/data1.txt
    /home/lijun/data   1.0  2.0 5.0 0.5
    

    现在newdata 目录中每个文件名都有一个数据文件。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-08-12
      • 2020-04-01
      • 1970-01-01
      • 2019-08-23
      • 1970-01-01
      • 2012-11-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多