두 번째 열을 주어진 길이로 자르는 방법

두 번째 열을 주어진 길이로 자르는 방법

특정 양식에 대한 입력

XY981743    foobarlkasdf saflkas asfZR!sgfad asdSAD asdsadf SAdfasdf46lk lksad bar foolkasjfdrte

두 번째 열만 자르려면 어떻게 해야 합니까? 구분 기호는 TAB이며 두 번째 열의 길이는 75자를 초과할 수 없습니다.

답변1

를 사용 awk하고 탭을 사용하여 파일을 분할하고 첫 번째 필드와 두 번째 필드의 처음 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

두 번째 열의 처음 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개 이상의 열이 있을 수 있고 두 번째 열만 자르고 싶다면 이렇게 하면 됩니다(방금 알아본 것처럼 이는 단지스티븐의 대답):

$ 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

답변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자 이후 삭제된 부분입니다.

관련 정보