我有一個與字串關聯的串列,如下所示;
A string1^description1`string2^description2`string3^description3
B string4^description4
C string1^description1`string5^description5`string3^description3
D .
E string6^description6`string1^description1
F string7^description7
G string1^description1`string4^description4`string5^description5
我想切換第一列和第二列,使第二列中的字串成為主串列,而前一列成為字串,如下所示;
string1^description1 A C E G
string2^description2 A
string3^description3 A C
string4^description4 B G
string5^description5 C G
string6^description6 E
string7^description7 F
我一直在努力解決這個問題,什么也想不出來。我是腳本新手。
uj5u.com熱心網友回復:
from collections import defaultdict
data = '''A string1^description1`string2^description2`string3^description3
B string4^description4
C string1^description1`string5^description5`string3^description3
D .
E string6^description6`string1^description1
F string7^description7
G string1^description1`string4^description4`string5^description5'''
d = defaultdict(list)
for line in data.split('\n'): # split the input data into lines
char, info = line.split() # in each line get the char and info
for desc in info.split('`'): # get the categories separated by `
if len(desc) < 6: # avoid case like line D where there is no data
continue
d[desc].append(char)
for k, v in d.items():
print(f"{k} {' '.join(v)}")
輸出:
string1^description1 A C E G
string2^description2 A
string3^description3 A C
string4^description4 B G
string5^description5 C G
string6^description6 E
string7^description7 F
uj5u.com熱心網友回復:
AWK 解決方案:
#! /usr/bin/env bash
INPUT_FILE="$1"
awk \
'
BEGIN {
FS=" "
}
{
key=$1
$1=""
gsub(/^ */, "")
n=split($0, a, /`/)
for (i=1; i<=n; i ) {
if (a[i] != ".") {
hash[a[i]]=hash[a[i]] " " key
}
}
}
END {
PROCINFO["sorted_in"] = "@ind_str_asc"
for (elem in hash) {
print elem " " hash[elem]
}
}
' \
< "${INPUT_FILE}"
輸出:
string1^description1 A C E G
string2^description2 A
string3^description3 A C
string4^description4 B G
string5^description5 C G
string6^description6 E
string7^description7 F
uj5u.com熱心網友回復:
由于我們似乎在遍歷標簽,這里有一個 perl 解決方案:
#!/usr/bin/env perl
use v5.10;
my %labels;
while (<>) {
chomp;
my ($label, $rest) = split ' ',$_,2;
foreach my $key (split '`', $rest) {
push @{$labels{$key}}, $label unless $key eq '.'
}
}
foreach my $key (sort keys %labels) {
say "$key\t", join("\t", @{$labels{$key}});
}
但所有這些都有相同的想法。您在空格上拆分行以將初始字母與字串/描述對分開,然后在反引號上拆分這些對以提取單個的,它們成為關聯陣列(dict/hash)中的鍵,其值是字母串列在誰的線上看到了字串/描述對。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/534287.html
