Vergleichen Sie zwei kommagetrennte Strings und listen Sie die gemeinsamen Werte auf - linux, bash

Wie viel ich die zwei Komma getrennte Liste (Master und Eingabe) und listet die gemeinsamen Werte unter ihnen (Ergebnis) unter Beibehaltung der Reihenfolge der Elemente in der Master-Liste. Zum Beispiel:

Fall 1:

master="common,city,country"
input="city,country"

result="city,country"

Fall 2:

master="common,city,country"
input="country,pig,cat,common"

result="common,country"

Fall 3:

master="common,city,country"
input="pigs,cars,train"

result="nothing found"

Das habe ich ausprobiert:

result="$(awk -F, -v master_list=$master"{ for (i=1;i<=NF;i++) { if (master_list~ $i) { echo $i } } } END " <<< $input)"

Antworten:

2 für die Antwort № 1

Hier ist eine awk-oneliner Lösung:

awk -v RS=",|n" "NR==FNR{a[$0]=1;next}
{a[$0]++}a[$0]>1{r=r?r","$0:$0}
END{print r?r:"Nothing found"}" <(<<< $master) <(<<<$input)

Testen Sie mit Ihren 3 Fällen:

Fall 1

kent$ master="common,city,country"
kent$ input="city,country"
kent$ result=$(awk -v RS=",|n" "NR==FNR{a[$0]=1;next}{a[$0]++}a[$0]>1{r=r?r","$0:$0}END{print r?r:"Nothing found"}" <(<<< $master) <(<<<$input))
kent$ echo $result
city,country

Fall 2

kent$ master="common,city,country"
kent$ input="country,pigs,cat,common"
kent$ result=$(awk -v RS=",|n" "NR==FNR{a[$0]=1;next}{a[$0]++}a[$0]>1{r=r?r","$0:$0}END{print r?r:"Nothing found"}" <(<<< $master) <(<<<$input))
kent$ echo $result
country,common

Fall 3

kent$ master="common,city,country"
kent$ input="pigs,cars,train"
kent$ result=$(awk -v RS=",|n" "NR==FNR{a[$0]=1;next}{a[$0]++}a[$0]>1{r=r?r","$0:$0}END{print r?r:"Nothing found"}" <(<<< $master) <(<<<$input))
kent$ echo $result
Nothing found

2 für die Antwort № 2

Sie können verwenden grep mit BASH String-Manipulationen:

cmn() {
local master="$1"
local input="$2"
result=$(grep -Ff <(printf "%sn" ${input//,/ }) <(printf "%sn" ${master//,/ }))
echo "${result//$"n"/,}"
}


cmn "common,city,country" "city,country"
city,country

cmn "common,city,country" "country,pig,cat,common"
common,country

cmn "common,city,country" "pigs,cars,train"

1 für die Antwort № 3

Sie können das Comm-Dienstprogramm verwenden

my_comm() {
res=$(comm -12 <(echo "$1" | tr "," "n" | sort) <(echo "$2" | tr "," "n" | sort) | xargs | tr " " ",")
[[ -z $res ]] && echo nothing found || echo $res
}

aus

> my_comm common,city,country city,country
city,country
> my_comm common,city,country country,pig,cat,common
common,country
> my_comm common,city,country pigs,cars,train
nothing found

Am beliebtesten