0이 아닌 모든 결과를 "1"로 대체하여 존재/부재를 형성합니다.

0이 아닌 모든 결과를 "1"로 대체하여 존재/부재를 형성합니다.

탭으로 구분된 테이블이 있습니다.

  a b c
A 5 2 0
B 0 5 4
C 4 3 4
D 2 0 2

열이나 행 이름을 변경하지 않고 0이 아닌 값을 "1"로 변경하고 싶습니다.

원하는 출력:

  a b c
A 1 1 0
B 0 1 1
C 1 1 1
D 1 0 1

이를 명확히 하기 위해 다음은 예제 테이블입니다. 이 문자는 열/행 이름을 나타내는 변수입니다. 수백 개의 열과 행이 있을 수 있습니다. 0이 아닌 값(여기서 숫자로 지정됨)은 반드시 숫자일 필요는 없습니다. 예를 들어 사람의 이름일 수 있습니다.

답변1

엄격하게 탭으로 구분된 입력을 가정하면 다음과 같습니다.

$ cat data.in
        a       b       c
A       nancy   bilbo baggins   0
B       0       darcy   bender
C       phantom menace  Unix    !!
D       last row        0       the end

$ cat -t data.in
^Ia^Ib^Ic
A^Inancy^Ibilbo baggins^I0
B^I0^Idarcy^Ibender
C^Iphantom menace^IUnix^I!!
D^Ilast row^I0^Ithe end

awk작업을 수행하는 스크립트:

BEGIN { OFS = FS = "\t" }

NR != 1 {
    for (i = 2; i <= NF; ++i) {
        if ($i != "0") {
            $i = "1";
        }
    }
}

{ print }

실행하세요:

$ awk -f script.awk data.in
        a       b       c
A       1       1       0
B       0       1       1
C       1       1       1
D       1       0       1

스크립트는 0각 필드(열)를 단일 문자(첫 번째 필드 제외)와 비교하여 0로 출력합니다 1. 출력은 탭으로 구분됩니다.

답변2

sed '1!s/ [^ ]*[^ 0][^ ]*/ 1/g'

0공백 이외의 문자가 하나 이상 포함된 공백이 아닌 문자의 시퀀스는 (첫 번째 줄 제외) 로 대체됩니다 .1

IOW, 이는 0 시퀀스와 첫 번째 열 및 행을 제외한 모든 항목을 대체합니다 1.

답변3

제목에 귀하의 예와 같은 숫자가 포함되어 있지 않다는 점을 고려할 때 제가 생각할 수 있는 가장 쉬운 방법은 다음과 같습니다.

sed 's/[1-9]/1/g' file.txt

참고 범위: 1~9(0 제외)

$ echo "A 5 2 0" |sed 's/[1-9]/1/g'
A 1 1 0

이 방법은 열의 숫자가 최대 9인 경우에 작동합니다. 그렇지 않고 그 수가 10개 이상이 될 수 있다면 수정해야 합니다.

OP의 최신 설명에 따르면 0이 아닌 항목은 이름 등이 될 수 있으므로 작동하지 않습니다.

답변4

이것은 bash에서만 작동합니다.

bash$ paste <(cut -f1 file) <(cut -f2- file |
        sed -r '1b;        # if title line then skip to end
        s#\t#\n#g          # seperate line to multi-line
        s#.*[^0].*#1#Mg    # apply multi-line operation 
        s#\n#\t#g' )       # turn to one line

        a       b       c
A       1       1       0
B       0       1       1
C       1       1       1
D       1       0       1

관련 정보