2番目の列を与えられた長さに切り取る方法

2番目の列を与えられた長さに切り取る方法

特定のフォームへの入力

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文字以降削除された部分です。

関連情報