2016-06-30 3 views
-4

다른 열과 구분 기호 (쉼표, 공백 및 탭)마다 여러 개의 파일이 있습니다. 특정 열의 모든 행의 처음 10자를 제거해야합니다. 예를 들어 sed 's/..........//'는이 트릭을 수행 할 수 있지만 원하는 열을 어떻게 표시 할 수 있으며 어떻게 파일의 구분 기호를 지정할 수 있습니까? 아마도 awk로 더 쉽게 할 수 있을까요? awk를 사용하면 열을 지정하는 방법을 알지만 처음 10자를 지우는 방법은 알지 못합니다. 감사.파일에서 문자를 제거합니다 (bash).

+2

... – armandino

+2

입력의 예를 제공하고 원하는하세요 산출. –

+0

awk는'substr()'함수를 사용할 수 있습니다. 당신은'awk '{$ 3 = substr ($ 3,1,10); print $ 0}'와 같은 것을 할 수 있습니다 (분명히 필드 3을 가정). 더 자세한 설명을 위해 모든 awk 문자열 함수가있는 [이 멋진 페이지] (https://www.gnu.org/software/gawk/manual/html_node/String-Functions.html)를 확인하십시오. – JNevill

답변

1

프런트 제거 기능 등을 정의 FS의 구분 : 당신이 도움이 될 예제를 제공하는 경우

$ cat > test.in # \t below is really a tab 
12345678901 2,3\t4 

$ cat > test.awk 
function ftrunc(str) { # this function removes up to 10 first chars of a named field 
    gsub(/^.{1,10}/,"",str) 
    return str 
} 
BEGIN { 
FS="[, \t]"    # look at me! look at me! look at me! 
OFS="|" 
} 
{ 
    print ftrunc($1),ftrunc($2),$3,$4 
} 

$ awk -f test.awk test.in 
1||3|4 
4

질문의 첫 번째 부분은, 필드의 처음 10 개 개의 문자를 삭제하는 방법을 한 가지 방법은 다음과 같이이다 : 빈 종료됩니다 10 개 이하의 문자

$ echo 1234567890ABCDEF | awk '{$1=substr($1,11)}1' 
ABCDEF 

필드.

둘째, 당신은 출력에 같은 구분을 유지하려는 가정, 필드 구분 기호를 지정하려면, 그것은 BEGIN 블록을 사용하고 FSOFS 내장의 AWK 변수를 설정하는 것이 가장 좋습니다. 이 예에서

우리는 콤마로 구분 기록의 두 번째 필드에서 처음 10 개 개의 문자를 제거 :

$ echo field1,1234567890ABCDEF,field3 | awk 'BEGIN {FS=OFS=","} {$2=substr($2,11)}1' 
field1,ABCDEF,field3 

(탭 - 구분 된 경우 : BEGIN {FS=OFS="\t"})를

관련 문제