如何将awk中的输出重定向为python中的变量?

时间:2018-02-13 03:46:43

标签: python linux python-3.x awk split

说我有一个下面给出的数据文件。给定的awk command使用列的第一个值将文件拆分为多个部分,并将其写入文件。

chr pos idx len
2   23  4   4   
2   25  7   3   
2   29  8   2   
2   35  1   5   
3   37  2   5   
3   39  3   3   
3   41  6   3   
3   45  5   5   
4   25  3   4   
4   32  6   3   
4   38  5   4   

awk 'BEGIN {FS=OFS="\t"} {print > "file_"$1".txt"}' write_multiprocessData.txt

上面的代码会将文件拆分为file_2.txt,file_3.txt ....因为,awk首先将文件加载到内存中。我宁愿写一个python脚本来调用awk并拆分文件并直接将其加载到linux内存中(并将数据的唯一变量名称作为file_1,file_2)。

这可能吗?如果没有,我可以尝试其他变化。

2 个答案:

答案 0 :(得分:0)

这里不需要Awk。

from collections import defaultdict
prefix = defaultdict(list)
with open('Data.txt', 'r') as data:
    for line in data:
        line = line.rstrip('\r\n')
        prefix[line.split()[0]].append(line)

现在你在dict prefix中将所有行中的所有第一个字段作为键,以及带有该前缀的行列表作为每个键的值。

如果您还希望此时将结果写入文件,这是一个简单的练习。

通常,简单的Awk脚本几乎总是很容易在Python中重新实现。因为Awk非常专门用于一组受限制的任务,所以Python代码通常不那么简洁,但是考虑到Python格言“显式比隐式更好”,这实际上可能是可读性和可维护性的观点。

答案 1 :(得分:0)

我认为你的awk代码有一点bug。如果你想将你的awk代码合并到一个python代码中,组织你要做的所有事情,试试这个:

htmlstring = "<img src='" + serverURL() + "/images/" + arr[i].imagefile + "' height='100'><div>" + arr[i].itemName + "</div><div>" + arr[i].price + "</div><a href='#' class='ui-btn' id='btn" + arr[i].itemID + "'>View Item</a>"; //add a new [Category] button

$("#result").append(htmlstring);

os.system工作得很好,但我不知道它是否过时。无论如何,正如建议的子过程一样:

import os
from numpy import *


os.system("awk '{if(NR>1) print >\"file_\"$1\".txt\"}' test.dat")