行から重複した数字を削除する方法は? [閉鎖]

行から重複した数字を削除する方法は? [閉鎖]

入力ファイル

1 2 3 1 4 5 6 1 1 2 34 5 6 2

私の考えでは出力このように

1 2 3 4 5 6 34 

(繰り返される数字はすべて一度だけ印刷されます)

答え1

Perlが救出に来る!

perl -lane 'print join " ", grep ! $seen{$_}++, @F' < file
  • -l入力から改行文字を削除し、出力に追加します。
  • -n入力を1行ずつ処理
  • -aスペースの各入力を @F 配列に分割する

@F 配列は次のように繰り返されます。grep、最初に見た要素のみを保持します(つまり、ゼロの否定が真であるため、%seenハッシュの対応する値は0です)。参加するちょうどもう一度貼ってください。

答え2

メモ: このソリューションは結果を元の順序で維持します!


awkこれはおよびを使用して簡単に実行できますtr。コンテンツがファイルにある場合FILE

$ tr ' ' '\n' < FILE | awk '!x[$0]++' | tr '\n' ' '

はい

$ echo "1 2 3 1 4 5 6 1 1 2 34 5 6 2" | \
    tr ' ' '\n' | awk '!x[$0]++' | tr '\n' ' '
1 2 3 4 5 6 34

どのように動作しますか?

  • tr ' ' '\n'- スペースを改行文字に切り替える
  • awk '!x[$0]++'- ユニークなキャラクターを印刷する
  • tr '\n' ' '- スイッチラインが空白に戻す

答え3

そしてawkファイル全体から重複するアイテムを削除する):

awk '{ SEP=""; i=0;  
       while (++i<=NF) { printf (!unq[$i]++? SEP $i:""); SEP=" "};
       print "";
}' infile

または、各行から重複項目を個別に削除する:

awk '{ SEP=""; i=0; delete unq;
       while (++i<=NF) { printf (!unq[$i]++? SEP $i:""); SEP=" "};
       print "";
}' infile

数字を繰り返し、以前に見たことがない場合は呼び出し配列に追加し、unqそれprintf以外の場合は何も印刷しません。

今後読む内容:

答え4

を使用してこれを行うことができますsort。ソートは行でのみ機能するため、ファイルのスペースを新しい行に置き換える必要があります。

たとえば、ファイルに次のものがtest.txt含まれているとします。

 1 2 3 1 4 5 6 1 1 2 34 5 6 2

以下のコードは必要なものを返します

>sed "s/ /\n/g" test.txt | sort -un
1
2
3
4
5
6
34

は「固有」(重複しない値)を返しますが、sort -u数値ソートを使用しない限り、アルファベット順にソートされますsort -n。ここでは連続した重複だけを取り除くので、整列が必要なので、uniqとにかくパイプをする必要があります。sort -n | uniqsort

関連情報