在bash中排序csv列,将bash输出读入python变量

4 投票
7 回答
2807 浏览
提问于 2025-04-16 05:34

你好,我有很多数据存储在多个csv文件里,我用grep工具筛选出了一部分数据:

user@machine:~/$ cat data.csv | grep -a "63[789]\...;"
637.05;1450.2
637.32;1448.7
637.60;1447.7
637.87;1451.5
638.14;1454.2
638.41;1448.6
638.69;1445.8
638.96;1440.0
639.23;1431.9
639.50;1428.8
639.77;1427.3

我想找出哪个数据集的数量最多,具体来说,就是分号右边的那一列,然后想知道对应的值(分号左边的)。在这个例子中,我想找的结果是638.14;1454.2。

我尝试了不同的方法,最后用了一些bash和python的组合,虽然能用,但看起来不太好:

os.system('ls | grep csv > filelist')
files = open("filelist")
files = files.read()
files = files.split("\n")

for filename in files[0:-1]:
  os.system('cat ' + filename + ' | grep -a "63[6789]\...;" > filtered.csv')
  filtered = csv.reader(open('filtered.csv'), delimiter=';')
  sortedlist = sorted(filtered_file, key=operator.itemgetter(1), reverse=True)
  dataset = sortedlist[0][0] + ';' + sortedlist[0][1] + '\n'

我希望能找到一个只用bash的解决方案(比如cut、awk、数组之类的),但我没搞明白。此外,我也不喜欢把bash命令写入文件,然后再读入python变量的这种方法。我能不能直接把它们读入变量,或者有没有更好的解决方案?(可能有perl等其他方法,但我真的想要一个bash的解决方案……)

非常感谢!!

7 个回答

1
$ cat data.csv | grep -a "63[789]\...;" | awk 'BEGIN {FS=";"} $2>max{max=$2; val=$1} END {print "max " max " at " val}' 

max 1454.2 at 638.14

当然可以!请把你想要翻译的内容发给我,我会帮你用简单易懂的语言解释清楚。

6

这里有一个简单的一行代码:

grep -a "63[789]\...;" data.csv | sort -n -r -t ';' -k 2 | head --lines=1

这段代码的意思是,它会根据文件中第二列的数字进行排序,然后打印出第一行的内容。希望这对你有帮助。

3

如果你打算使用Python,那就直接用Python吧。为什么要把bash命令混在一起呢?这样会让你的代码变得不便移植,还依赖于bash环境。

import os
import glob
import operator
os.chdir("/mypath")
for file in glob.glob("*.csv"):
    data=open(file).readlines()
    data=[i.strip().split(";") for i in data if i[:3] in ["637","638","639"]]
    # data=[i.strip().split(";") for i in data if i[:3] in ["637","638","639"] and isinstance(float(i[:6]),float) ]
    sortedlist = sorted(data, key=operator.itemgetter(1), reverse=True)
    print "Highest for file %s: %s" % (file,sortedlist[0])

或者,如果你更喜欢用bash加工具的方式

find . -type f -name '*.csv' |while read -r FILE
do
 grep -a "63[789]\...;" "$FILE" | sort -n -r -t ';' -k 2 | head -1  >> output.txt
done

撰写回答