[英]Merge rows based on values and key string in awk, sed or python
我有以下输入表:
1 2 A "aaa"
3 4 A "aaa"
5 6 A "aaa"
1 2 B "bbb"
3 4 B "bbb"
1 2 A "ccc"
我想得到:
output1-输入的输出分别来自第1列和第2列的最小值和最大值,第4列中的名称相同
1 6 A "aaa"
1 4 B "bbb"
1 2 A "ccc"
output2-从“行之间”的第1列和第2列的输入打印值开始; 将第2列(第1行)和第1列(第2行)中的值带到第4列中具有相同名称的新行1中(第4列中的名称更改时跳过,例如输入的第3、5、6行)。
2 3 A "aaa"
4 5 A "aaa"
2 3 B "bbb"
非常感谢您的建议。
提前致谢!
这是用awk
做零件#1的一种方法
awk '!b[$3" "$4]||b[$3" "$4]>$1 {b[$3" "$4]=$1} !t[$3" "$4]||b[$3" "$4]<$2 {t[$3" "$4]=$2} END {for (i in b) print b[i],t[i],i}' file
1 2 A "ccc"
1 6 A "aaa"
1 4 B "bbb"
如果#3列始终连接到#4列
awk '!b[$4]||b[$4]>$1 {b[$4]=$1} !t[$4]||b[$4]<$2 {t[$4]=$2} {z[$4]=$3} END {for (i in b) print b[i],t[i],z[i],i}' file
1 6 A "aaa"
1 2 A "ccc"
1 4 B "bbb"
在python中,您可以尝试以下解决方案。 我对其进行了编辑,以使其不仅接受索引的连续数字。
# -*- encoding: utf-8 -*-
def get_min_max_index(data):
result = dict()
names = set([record[3] for record in data])
for name in names:
name_records = filter(lambda record: record[3] == name, data)
name_indices = map(lambda record: (record[0], record[1]), name_records)
record_id = name_records[0][2]
result[name] = (min(name_indices)[0], max(name_indices)[1], record_id, name_indices)
return result
def get_between_rows(data):
records_min_max = get_min_max_index(data)
result = list()
for i in range(len(data) - 1):
name = data[i][3]
max_ind = records_min_max[name][1]
if data[i][1] < max_ind:
result.append([data[i][1], data[i+1][0], data[i][2], data[i][3]])
return result
if __name__ == "__main__":
import sys
data = list()
for line in sys.stdin.readlines():
line = line.strip().split()
data.append([int(line[0]), int(line[1]), line[2], line[3].strip('"')])
for name, line in get_min_max_index(data).items():
print('{0} {1} {2} {3}'.format(line[0], line[1], line[2], name))
print('\n')
for line in get_between_rows(data):
print('{0} {1} {2} {3}'.format(line[0], line[1], line[2], line[3]))
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
这是命令cat linked.txt | python linked.py
的结果。 cat linked.txt | python linked.py
1 6 A aaa
1 4 B bbb
1 2 A ccc
2 3 A aaa
4 5 A aaa
2 3 B bbb
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.