特定の文字列を含むフィールドを削除する

特定の文字列を含むフィールドを削除する

file1特定の文字列(私の場合はアンダースコア文字)を含むフィールドのみを削除したいタブで区切られた複数のフィールドがあります(すべての行は削除しません_)。

cat file1
357M        2054_
357_        154=        1900_
511_        419X        1481_        34=

次の情報を取得したいと思います。

cat file2
357M
154=
419X        34=

次のようにこれらのフィールドを削除しました。

cat file1 | perl -pe 's/\w+_\s*//g'
357M    154=        419X        34=

しかし、列の数を変更したくないので、フォーマットが悪いです。

私も次のことを試しました。

cat file1 | sed 's/[0-9]*_//g'
357M
          154=
          419X         34=

しかし、その空の列を削除したいと思います。

実際に機能する無差別アプローチは次のとおりです。

cat file1 | sed 's/[0-9]*_//g' | tr -s '\t' '\t' | sed 's/^[ \t]*//g'
357M
154=
419X         34=

最後のコマンドは、(1)下線付きのすべてのフィールドを削除します。 (2)連続した複数のタブを1つのタブに置き換えます。 (3) 先行タブを削除します。それでもそれほどエレガントではありません。

どんな提案がありますか?

答え1

考慮する:

sed 's/[^\t]*_//; s/\t[^\t]*_/\t/g' < input

これは2つの(条件付き)置換を実行します。

  • 1つ目は、「タブ以外の文字の後に下線が付くすべての(0個以上の)文字」を意味し、「(なし)」に置き換えられます。
  • 2番目は、「タブの後にタブ以外の文字(0個以上)の後に下線が付く」を「タブ」に置き換えることを意味し、その検索パターンが見つかった回数だけこれを行います。

削除する先行フィールドを見つけるには、最初の検索が必要です。 2番目の検索では、残りを削除します。

これにより、その列の元のフィールドが保持されます。

357M
        154=
        419X            34=

フィールドを完全に削除するには、検索にタブを含めてテキストを置き換えます。

sed 's/[^\t]*_\t//; s/\t[^\t]*_//g' < input

結果:

357M
154=
419X    34=

答え2

これを簡単に使用できますsed

sed 's/\w*_\s*//;/^$/d' infile.txt 

/^$/dfoo_下線またはそれ自体で_終わるフィールドが1つだけ含まれている行は、空白行が削除されます。

結果は次のとおりです。

357M
154=
419X    34=

答え3

常に「無差別代入と無知」アプローチがあります。

  • 無効なフィールドの削除
  • 複数のタブを単一のタブに変換
  • 行の先頭から単一のタグを削除します。
  • 行末から個々のタブを削除する

賢くも賢くもありませんが、うまくいきます。

以下では、TABはリテラルTAB文字を意味します。

sed -e 's/[0-9]*_//g' -e 's/TABTAB/TAB/g' -e 's/^TAB//' -e 's/TAB$//'

例えば

$ cat x
357M    2054_
357_    154=    1900_
511_    419X    1481_   34=
$ sed -e 's/[0-9]*_//g' -e 's/            /       /g' -e 's/^     //' -e 's/     $//' < x
357M
154=
419X    34=

答え4

内部フィールドにのみ興味がある場合(例:いいえ行の最初または最後のフィールド)。しかし、すべての領域を見たいです。したがって、各行の最後のフィールドを処理しないように見えるソリューションがあります。

sed -e 's/$/\t/' -e 's/[^\t]*_[^\t]*\t//g' -e 's/\t$//'

これ

  1. 各行の最後にタブ文字を追加します(したがって、効果的にn+1 空のフィールド)。
  2. (タブではなく文字列)を含むすべてのフィールドを見つけて、そのフィールド_ と次のタブ文字を削除します(空の文字列に置き換えます)。これは以下に適用されます。N 最初のフィールド(つまり、元の行の最後のフィールド)は、手順1で最後にタブ文字を追加したためです。
  3. 行末から追加のタブ文字を削除します。

空のフィールドを維持する機能があります(あなたが要求していないことを知っていますが、利用可能であることを確認してください。ありがとうございます)。

$猫ファイル3
茶色の犬が飛び上がった。
        アジャイルキツネは怠惰なキツネよりも優れています
4年_年
        7年前の成績..

$(上記コマンド)ファイル3
茶色の犬が飛び上がった。
        アジャイルキツネは怠惰なキツネよりも優れています
四年
        7年前の成績..

sedPS使用しているバージョンによっては、代わりにコマンドに実際のタブを入力する必要があります\t。または、bashを使用している場合はincludeを$'…'使用できます。sed\t

関連情報