簡體   English   中英

在awk,sed或python中基於值和鍵字符串合並行

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM