web-dev-qa-db-ja.com

シェルを使用してファイルの最初の2列を削除する方法(awk、sedなど)

各行に多くの行があるファイルがあります。空白で区切られた多くの列(フィールド)があります ""各行の列の数が異なります最初の2列を削除する方法

67
wenzi

cutでできます:

cut -d " " -f 3- input_filename > output_filename

説明:

  • cut:cutコマンドを呼び出します
  • -d " ":区切り文字として単一のスペースを使用します(cutはデフォルトでTABを使用します)
  • -f:保持するフィールドを指定します
  • 3-:フィールド3で始まるすべてのフィールド
  • input_filename:このファイルを入力として使用します
  • > output_filename:出力をこのファイルに書き込みます。

または、awkを使用して実行できます。

awk '{$1=""; $2=""; sub("  ", " "); print}' input_filename > output_filename

説明:

  • awk:awkコマンドを呼び出します
  • $1=""; $2="";:フィールド1および2を空の文字列に設定します
  • sub(...);:フィールド1と2はまだ「」で区切られているため、出力フィールドをクリーンアップします
  • print:変更された行を出力します
  • input_filename > output_filename:上記と同じ。
136
sampson-chen

Awkでそれを行う1つの方法は、比較的簡単です。

awk '{print substr($0, index($0, $3))}'

これはパターンのない単純なawkコマンドなので、{}内のアクションはすべての入力行に対して実行されます。

アクションは、3番目のフィールドの位置から始まる部分文字列を単に印刷することです。

  • $0:入力行全体
  • $3:3番目のフィールド
  • index(in, find):文字列find内のinの位置を返します
  • substr(string, start):インデックスstartで始まる部分文字列を返します

コンマなどの別の区切り文字を使用する場合は、-Fオプションで指定できます。

awk -F"," '{print substr($0, index($0, $3))}'

{}でアクションの前にパターンを指定することにより、入力行のサブセットでこれを操作することもできます。パターンに一致する行のみがアクションを実行します。

awk 'pattern{print substr($0, index($0, $3))}'

パターンは次のようなものです。

  • /abcdef/:正規表現を使用し、デフォルトで$ 0で動作します。
  • $1 ~ /abcdef/:特定のフィールドを操作します。
  • $1 == blabla:文字列比較を使用
  • NR > 1:レコード/行番号を使用
  • NF > 0:フィールド/列番号を使用
22
raychi

質問を投稿していただきありがとうございます。また、私を助けたスクリプトを追加したいと思います。

awk '{ $1=""; print $0 }' file
12
Felipe Alvarez
awk '{$1=$2="";$0=$0;$1=$1}1'

入力

a b c d

出力

c d
8
Steven Penny

シェルだけでそれを行うのはかなり簡単です

while read A B C; do
echo "$C"
done < oldfile >newfile
6
technosaurus

sedを使用できます:

sed 's/^[^ ][^ ]* [^ ][^ ]* //'

これは、1つ以上の非空白、空白、1つ以上の非空白の別のセット、および別の空白で始まる行を探し、一致したマテリアル(最初の2つのフィールド)を削除します。 [^ ][^ ]*は、同等であるがより明示的な[^ ]\{1,\}表記よりわずかに短く、2番目はGNU sedで問題が発生する可能性があります(ただし、--posixオプションとして、GNU sedでさえ、それを台無しにすることはできません。 OTOH、繰り返される文字クラスがより複雑な場合、簡潔にするために番号表記が優先されます。これを簡単に拡張して、「空白またはタブ」をセパレータとして、または「複数の空白」または「複数の空白またはタブ」として扱うことができます。最初のフィールドなどの前にオプションの先行ブランク(またはタブ)を処理するように変更することもできます。

awkおよびcutについては、 Sampson-Chenanswer を参照してください。 awkスクリプトを記述する方法は他にもありますが、与えられた答えよりも実質的に優れているわけではありません。タブをセパレータとして扱いたくない場合、またはフィールド間に複数の空白がある場合は、awkでフィールドセパレータを明示的に設定する必要がある場合があることに注意してください(-F" ")。 POSIX標準cutは、フィールド間の複数の区切り文字をサポートしていません。 GNU cutには、フィールド間で複数の区切り文字を使用できるようにする便利な非標準の-iオプションがあります。

純粋なシェルでも実行できます。

while read junk1 junk2 residue
do echo "$residue"
done < in-file > out-file
6

Perl:

Perl -lane 'print join(' ',@F[2..$#F])' File

awk:

awk '{$1=$2=""}1' File
4
Vijay

これはあなたのために働くかもしれません(GNU sed):

sed -r 's/^([^ ]+ ){2}//' file

または、1つ以上の空白で区切られた列の場合:

sed -r 's/^(\S+\s+){2}//' file
1
potong

Awkを使用し、以下のオプションのいくつかに基づいて、forループを使用すると、もう少し柔軟になります。最初の9列を削除したい場合があります(たとえば、「ls -lrt」を実行した場合)。2を9に変更します。

awk '{ for(i=0;i++<2;){$i=""}; print $0 }' your_file.txt

0
Carlos

kscript を使用

kscript 'lines.split().select(-1,-2).print()' file
0
Holger Brandl