Answers:
如果只想打印第二列的前75个字符(包括空格,并假设文件中只有两列),则可以执行以下操作:
$ 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列以上,而您只想截断第二列,则可以这样做(正如我刚刚注意到的那样,这只是对Stephen答案的重新措词):
$ awk -F"\t" -vOFS="\t" '{$2=substr($2,1,75)}1;' file
XY981743 foobarlkasdf saflkas asfZR!sgfad asdSAD asdsadf SAdfasdf46lk lksad bar fool
或(请注意,如果第二列的前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
sed
命令也是使用GNUism(\t
)。
\t
是GNUism?认真吗 那么,描述标签的可移植方式是什么?
\n
(同样在[...]
许多实现中也不是),在RHS上没有。
perl
一个没有任何意义。想想输入类似的实例aba\t.*
使用awk
,使用制表符分割文件,并完整输出第一个字段,并输出第二个字段的前75个字符(最多):
awk -F "\t" 'BEGIN { OFS=FS }; { print $1, substr($2, 1, 75); }'
如fedorqui所指出的,您可以通过替换需要截断的字段来处理具有两个以上字段的文件:
awk -F "\t" 'BEGIN { OFS=FS }; { $2=substr($2, 1, 75); print }'
substr
如有必要,可以通过将它们遍历来将其应用于多个字段。
;
需要?
/pattern/ {action} {exception-handling}
)。鉴于忽略这些;
情况相当普遍,因此现在极不可能。
如果只有两列:
sed -r 's/^([^\t]*\t)(.{0,75}).*/\1\2/'
{0,75}
表示选择0到75个字符。
.*
是超出char 75的已删除部分。
如果有2 列或更多列:
sed -r 's/^([^\t]*\t)([^\t]{0,75})[^\t]*(.*)/\1\2\3/' file
[^\t]*
是超出char 75的已删除部分。
sed
和POSIXLY_CORRECT
不在环境..
awk 'BEGIN{OFS=FS="\t"} {$2=substr($2,1,75)}1' file