如何将第二列截断为给定长度

Lou*_*e79 9 sed awk text-processing

给定表单输入

XY981743    foobarlkasdf saflkas asfZR!sgfad asdSAD asdsadf SAdfasdf46lk lksad bar foolkasjfdrte
Run Code Online (Sandbox Code Playgroud)

如何只截断第二列?分隔符是 TAB,第二列的长度不得超过 75 个字符。

Ste*_*itt 10

使用awk,使用制表符拆分文件并完整输出第一个字段和第二个的前 75 个字符(最多):

awk -F "\t" 'BEGIN { OFS=FS }; { print $1, substr($2, 1, 75); }'
Run Code Online (Sandbox Code Playgroud)

正如fedorqui所指出的,您可以通过替换需要截断的字段来处理具有两个以上字段的文件:

awk -F "\t" 'BEGIN { OFS=FS }; { $2=substr($2, 1, 75); print }'
Run Code Online (Sandbox Code Playgroud)

substr如有必要,您可以通过循环将它们应用于多个字段。


ter*_*don 7

如果您只想打印第二列的前 75 个字符(包括空格,并假设文件中只有两列),您可以执行以下操作:

$ perl -pe 's/(\t.{75}).*/$1/' file
XY981743    foobarlkasdf saflkas asfZR!sgfad asdSAD asdsadf SAdfasdf46lk lksad bar fool
Run Code Online (Sandbox Code Playgroud)

或者,使用 GNU sed

$ sed 's/\(.*\t.\{75\}\).*/\1/' file
XY981743    foobarlkasdf saflkas asfZR!sgfad asdSAD asdsadf SAdfasdf46lk lksad bar fool
Run Code Online (Sandbox Code Playgroud)

或者:

$ sed -r 's/(.*\t.{75}).*/\1/' file
XY981743    foobarlkasdf saflkas asfZR!sgfad asdSAD asdsadf SAdfasdf46lk lksad bar fool
Run Code Online (Sandbox Code Playgroud)

或者,您可以使用fold,告诉它在前 91 个字符处剪切(即 8 个用于标识符,另外 8 个用于制表符),并仅打印第一行:

$ fold -w 91 file | head -n1
XY981743    foobarlkasdf saflkas asfZR!sgfad asdSAD asdsadf SAdfasdf46lk lksad bar fool
Run Code Online (Sandbox Code Playgroud)

如果您的文件可以有 2 列以上,而您只想截断第二列,则可以这样做(正如我刚刚注意到的,这只是对Stephen 的回答的改写):

$ awk -F"\t" -vOFS="\t" '{$2=substr($2,1,75)}1;' file
XY981743    foobarlkasdf saflkas asfZR!sgfad asdSAD asdsadf SAdfasdf46lk lksad bar fool
Run Code Online (Sandbox Code Playgroud)

或者(请注意,如果第 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
Run Code Online (Sandbox Code Playgroud)