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
如有必要,您可以通过循环将它们应用于多个字段。
如果您只想打印第二列的前 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)