特定のフォームへの入力
XY981743 foobarlkasdf saflkas asfZR!sgfad asdSAD asdsadf SAdfasdf46lk lksad bar foolkasjfdrte
2番目の列だけを切り取るにはどうすればよいですか?区切り文字はTABで、2番目の列の長さは75文字を超えることはできません。
答え1
を使用awk
してタブを使用してファイルを分割し、最初のフィールドと2番目のフィールドの最初の75文字(最大)を完全に出力します。
awk -F "\t" 'BEGIN { OFS=FS }; { print $1, substr($2, 1, 75); }'
指摘したとおりフェドルキ、切り捨てる必要があるフィールドを置き換えることで、3つ以上のフィールドを持つファイルを処理できます。
awk -F "\t" 'BEGIN { OFS=FS }; { $2=substr($2, 1, 75); print }'
substr
必要に応じてループを介して複数のフィールドに適用できます。
答え2
2番目の列の最初の75文字だけを印刷したい場合(スペースを含む、ファイルに2つの列しかないと仮定)、次のことができます。
$ perl -pe 's/(\t.{75}).*/$1/' file
XY981743 foobarlkasdf saflkas asfZR!sgfad asdSAD asdsadf SAdfasdf46lk lksad bar fool
またはGNUを使用してくださいsed
。
$ sed 's/\(.*\t.\{75\}\).*/\1/' file
XY981743 foobarlkasdf saflkas asfZR!sgfad asdSAD asdsadf SAdfasdf46lk lksad bar fool
または:
$ sed -r 's/(.*\t.{75}).*/\1/' file
XY981743 foobarlkasdf saflkas asfZR!sgfad asdSAD asdsadf SAdfasdf46lk lksad bar fool
またはを使用して、fold
最初の91文字(識別子用の8文字、タブ用の8文字)を切り取るように指示し、最初の行のみを印刷できます。
$ fold -w 91 file | head -n1
XY981743 foobarlkasdf saflkas asfZR!sgfad asdSAD asdsadf SAdfasdf46lk lksad bar fool
ファイルに2つ以上の列がある可能性があり、2番目の列だけを切りたい場合は、これを行うことができます。スティーブンの答え):
$ awk -F"\t" -vOFS="\t" '{$2=substr($2,1,75)}1;' file
XY981743 foobarlkasdf saflkas asfZR!sgfad asdSAD asdsadf SAdfasdf46lk lksad bar fool
または(2番目の列の最初の75文字が正規表現として解釈される場合は、この内容は中止されます。)
$ perl -F"\t" -pale 's/$F[1]/substr($F[1],0,75)/e' file
XY981743 foobarlkasdf saflkas asfZR!sgfad asdSAD asdsadf SAdfasdf46lk lksad bar fool
答え3
以下を含むポータブル/POSIXly sed
:
tab=$(printf '\t')
sed "s/\($tab[^$tab]\{0,75\}\)[^$tab]*/\1/"
または各列を切り捨てます。
sed "s/\([^$tab]\{75\}\)[^$tab]*/\1/g"
答え4
もしあればただ2列:
sed -r 's/^([^\t]*\t)(.{0,75}).*/\1\2/'
{0,75}
0から75文字の間の選択を示します。
.*
75文字以降削除された部分です。
2つあれば以上リスト:
sed -r 's/^([^\t]*\t)([^\t]{0,75})[^\t]*(.*)/\1\2\3/' file
[^\t]*
75文字以降削除された部分です。