2012-01-07 4 views
0

하나의 열에 null 값이있는 경우 ":"로 구분 된 두 열의 값을 바꾸어 탭으로 구분 된 파일을 수정하려고합니다. 이 파일을awk/sed를 사용하여 한 열의 값이 null 인 경우 다른 열의 값 바꾸기

시작 :

id1 id2 pos1 pos2 
749 2847443 21 13517135 
862 2821796 21 13571669 
997  21 13636494 
1095 2821826 21 13661335 
1131  21 13678797 

나는 얻기 위해 열 2를 수정하고 싶은이 :

id1 id2 pos1 pos2 
749 2847443 21 13517135 
862 2821796 21 13571669 
997 21:13636494 21 13636494 
1095 2821826 21 13661335 
1131 21:13678797 21 13678797 

문제는 더 빈 공간 ("")을 나타내는이 없음을 또한 null 값. 어떤 작품

sed -e 's/\t\t/\t$3\t/g' input.txt > output 

그러나 그것은 단지 대체 : 내가 나오지 사용하여 시도했다

는 지금 난 ... 3 열이 null 인과 열 2의 값을 대체 할 수 없었다 텍스트 '$ 3'대신 $ 3 : $ 4 값을 대체하는 방법을 찾을 수 없습니다.

나는 또한 시도 AWK :

awk 'BEGIN { 
    IFS = OFS = "\t" 
} 
{ 
    for (column = 2; column <= NF; ++column) { 
    if ($column == "") { 
     $column = $3 
    } 
}  
print 
}   
' 
input.txt > output 

그러나이

당신이 좀 도와 주시겠습니까 (... 그것도 "도" ""사용하여 실제로 아무것도하지 않는다) 중 하나가 작동하지 않는 이유는 무엇입니까? 감사합니다. 텍스트는 당신이 2 열 경우는 null 3rd + '**:**' + 4th column
, 권리를 대체 할

B: 997  21 13636494 
A: 997 21:13636494 21 13636494 

을 게시 한 후

답변

3

null 값을 확인하는 것은 실제로 쉽습니다. 그러나 나는 요구 사항을 잘 이해하지 못했다. 어느 열이 null가 될지 어떨지 awk 스크립트에서 $ 2 -> $ NF의 루프를 가지며, 널 (NULL) 컬럼이 있으면 ":"분리 값으로 설정하지 않고 $ 3으로 설정합니다. 약 3 달러는 null입니까?

$ 2 (column2) 만 널일 수 있다고 가정하면 다음 awk 행이 작업을 수행해야합니다.

kent$ awk -F'\t' -vOFS='\t' '!$2{$2=$3":"$4}1' ff|column -t 
id1 id2   pos1 pos2 
749 2847443  21 13517135 
862 2821796  21 13571669 
997 21:13636494 21 13636494 
1095 2821826  21 13661335 
1131 21:13678797 21 13678797 

가 당신을 위해 도움이 될 것입니다 희망 :

awk -F'\t' -vOFS='\t' '!$2{$2=$3":"$4}1' file 

시험은

<ff is your input file> 

kent$ awk -F'\t' -vOFS='\t' '!$2{$2=$3":"$4}1' ff   
id1  id2  pos1 pos2 
749  2847443 21  13517135 
862  2821796 21  13571669 
997  21:13636494  21  13636494 
1095 2821826 21  13661335 
1131 21:13678797  21  13678797 

우리가 파이프 열 명령에 대한 출력을 할 수, 명확하게 볼 수 있습니다.

+0

이것은 (-v없이, 단지 -OFS)이 도움이된다. 도움을 주셔서 대단히 감사합니다! – user971102

2

/전과보고?

그래서이 갈 :

뭔가 tabtab 뭔가 탭 뭔가

이있는 라인과 일치

로 교체입니다

sed 's/\(.*\)\t\t\(.*\)\t\(.*\)/\1\t\2:\3\t\2\t\3/g' testfile 

첫 번째 열 t AB 3 열 : 4 열 탭 3 열 탭 4 열

예 :

$ cat testfile 
749 2847443 21 13517135 
862 2821796 21 13571669 
997  21 13636494 
1095 2821826 21 13661335 
1131  21 13678797 

$ sed 's/\(.*\)\t\t\(.*\)\t\(.*\)/\1\t\2:\3\t\2\t\3/g' testfile 
749 2847443 21 13517135 
862 2821796 21 13571669 
997 21:13636494 21 13636494 
1095 2821826 21 13661335 
1131 21:13678797 21 13678797 

주 : 이것은 당신이 이야기를 무엇으로 만 누락 된 2 열을 찾습니다 대한

추신 : 질문에 대한 답변이 있다고 생각한다면 정답으로 표시하는 것을 잊지 마시기 바랍니다.

+0

안녕하세요, sed 코드가 작동하지 않습니다 (입력 파일을 변경하지 않음). awk를 사용하여 Kent의 코드를 사용하지만 코드와 설명에 감사드립니다. 나는 왜 그것이 작동하지 않아야하는지 궁금해하지만 내 텍스트에 이상한 것이있을 수있다 ... – user971102

관련 문제