各行に多くの行があるファイルがあります。空白で区切られた多くの列(フィールド)があります ""各行の列の数が異なります最初の2列を削除する方法
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
:上記と同じ。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
:フィールド/列番号を使用質問を投稿していただきありがとうございます。また、私を助けたスクリプトを追加したいと思います。
awk '{ $1=""; print $0 }' file
awk '{$1=$2="";$0=$0;$1=$1}1'
入力
a b c d
出力
c d
シェルだけでそれを行うのはかなり簡単です
while read A B C; do
echo "$C"
done < oldfile >newfile
sed
を使用できます:
sed 's/^[^ ][^ ]* [^ ][^ ]* //'
これは、1つ以上の非空白、空白、1つ以上の非空白の別のセット、および別の空白で始まる行を探し、一致したマテリアル(最初の2つのフィールド)を削除します。 [^ ][^ ]*
は、同等であるがより明示的な[^ ]\{1,\}
表記よりわずかに短く、2番目はGNU sed
で問題が発生する可能性があります(ただし、--posix
オプションとして、GNU sed
でさえ、それを台無しにすることはできません。 OTOH、繰り返される文字クラスがより複雑な場合、簡潔にするために番号表記が優先されます。これを簡単に拡張して、「空白またはタブ」をセパレータとして、または「複数の空白」または「複数の空白またはタブ」として扱うことができます。最初のフィールドなどの前にオプションの先行ブランク(またはタブ)を処理するように変更することもできます。
awk
およびcut
については、 Sampson-Chen の answer を参照してください。 awk
スクリプトを記述する方法は他にもありますが、与えられた答えよりも実質的に優れているわけではありません。タブをセパレータとして扱いたくない場合、またはフィールド間に複数の空白がある場合は、awk
でフィールドセパレータを明示的に設定する必要がある場合があることに注意してください(-F" "
)。 POSIX標準cut
は、フィールド間の複数の区切り文字をサポートしていません。 GNU cut
には、フィールド間で複数の区切り文字を使用できるようにする便利な非標準の-i
オプションがあります。
純粋なシェルでも実行できます。
while read junk1 junk2 residue
do echo "$residue"
done < in-file > out-file
Perl:
Perl -lane 'print join(' ',@F[2..$#F])' File
awk:
awk '{$1=$2=""}1' File
これはあなたのために働くかもしれません(GNU sed):
sed -r 's/^([^ ]+ ){2}//' file
または、1つ以上の空白で区切られた列の場合:
sed -r 's/^(\S+\s+){2}//' file
Awkを使用し、以下のオプションのいくつかに基づいて、forループを使用すると、もう少し柔軟になります。最初の9列を削除したい場合があります(たとえば、「ls -lrt」を実行した場合)。2を9に変更します。
awk '{ for(i=0;i++<2;){$i=""}; print $0 }' your_file.txt
kscript を使用
kscript 'lines.split().select(-1,-2).print()' file