Perl を使用した簡単なソリューションを次に示します。これは、同じ行の 2 つの奇数列が同じ内容の場合に失敗します。たとえば、
C D C A # Would print out "C A" only
それ以外の場合は、キーと値のペアを簡単に操作できるハッシュ データ構造を使用できます。
perl -ple'%h=split;$_=join" ",map{$_=>$h{$_}}sort keys %h'
使用例:
$ perl -ple'%h=split;$_=join" ",map{$_=>$h{$_}}sort keys %h' <<'END'
A B C D
E F A B
H I A G
J K L M
N J Q K
END
出力:
A B C D
A B E F
A G H I
J K L M
N J Q K
その弱点がなければ、私はそれを次のように書きます
perl -pale'@f=();push@f,[splice@F,0,2]while@F;$_=join" ",map@$_,sort{$a->[0]cmp$b->[0]}@f'
これは本質的にシュワルツ変換を行います。
説明
最初の解決策:
このオプション-l
は、行末を処理します。-p
すべての入力行をループし (それらを に入れます)、反復ごと$_
に の内容を出力します。$_
ハッシュは、交互のキーと値のリストとして構築されます。オプションのsplit
ない関数は、空白の内容を分割$_
し、 hash に割り当てるリストを返します%h
。重複したキーは削除されます。最後のオカレンスのみが設定されます。
アルファベット順ですsort
。は各キーを取得し、キーのリストを交互のキーと値のリストに変換しますが、今回は正しい順序で変換します。keys
map
join
単一のスペースを介してこの文字列のリストを に割り当て$_
ます-p
。
2番目の解決策:
-a
オプション autoは配列split
に$_
挿入されます。with@F
の最初の 2 つの要素を取り、それらを匿名の arrayref に入れ、この arrayref を配列にプッシュします。要素がなくなるまで繰り返します。これにより、 の内容がペアになり、重複に悩まされることはありません。@F
splice
@f
@F
最初の要素をアルファベット順に配列参照し、結果の順序を で平坦化しsort
ます。その後、前と同じように文字列を結合します。@f
map