특정 양식에 대한 입력
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자 이후 삭제된 부분입니다.