我有以下输入表:
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"
我非常感谢你的建议。
提前致谢!
答案 0 :(得分:2)
以下是使用awk
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"
答案 1 :(得分:1)
在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
1 6 A aaa
1 4 B bbb
1 2 A ccc
2 3 A aaa
4 5 A aaa
2 3 B bbb