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
/^$/d
foo_
下線またはそれ自体で_
終わるフィールドが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$//'
これ
- 各行の最後にタブ文字を追加します(したがって、効果的にn+1 空のフィールド)。
- (タブではなく文字列)を含むすべてのフィールドを見つけて、そのフィールド
_
と次のタブ文字を削除します(空の文字列に置き換えます)。これは以下に適用されます。N 最初のフィールド(つまり、元の行の最後のフィールド)は、手順1で最後にタブ文字を追加したためです。 - 行末から追加のタブ文字を削除します。
空のフィールドを維持する機能があります(あなたが要求していないことを知っていますが、利用可能であることを確認してください。ありがとうございます)。
$猫ファイル3 茶色の犬が飛び上がった。 アジャイルキツネは怠惰なキツネよりも優れています 4年_年 7年前の成績.. $(上記コマンド)ファイル3 茶色の犬が飛び上がった。 アジャイルキツネは怠惰なキツネよりも優れています 四年 7年前の成績..
sed
PS使用しているバージョンによっては、代わりにコマンドに実際のタブを入力する必要があります\t
。または、bashを使用している場合はincludeを$'…'
使用できます。sed
\t