텍스트 파일의 다른 위치에서 값 제거

텍스트 파일의 다른 위치에서 값 제거

다음과 같이 3x66 행렬로 배열된 텍스트 파일이 있습니다 mat.txt.

0 -1 0.000532 -0.00026 0.000465 etc...
0 0.000294 1 -0.000102 -0.1146 etc...
0 -0.000134 0.0000967 1 -0.9972 etc...

이러한 값은 3D 좌표 쌍으로 볼 수 있습니다. 여기서 각 행의 첫 번째 값은 (x,y,z) 좌표를 나타내고, 각 행의 두 번째 값은 다른 (x,y,z) 좌표를 나타냅니다. . 시작 부분의 0 외에도 숫자는 파일마다 다르므로 문자열이 아닌 텍스트 파일의 위치를 ​​기준으로 위치를 지정해야 합니다.

파일에서 특정 좌표를 제거해야 하는데, 좌표는 파일에 따라 달라집니다. 전체 열을 분리하여 삭제하는 데 사용할 수 있을 거라 생각했는데 awk삭제할 열을 어떻게 동적으로 읽어야 할지 모르겠습니다. 삭제해야 할 열이 포함된 별도의 텍스트 파일이 있습니다.

예를 들어:

cat delete.txt
2 5 18 27 59

awk를 사용하여 열 2, 5, 18 등을 분리하고 삭제할 수 있나요?

for i in $(cat delete.txt)
do
awk '{print $i}' | rm $i << mat.txt
done

답변1

다음의 경우 infile:

0 -1 0.000532 -0.00026 0.000465 etc...
0 0.000294 1 -0.000102 -0.1146 etc...
0 -0.000134 0.0000967 1 -0.9972 etc...

delete좋아요에서 제거하려는 열 번호는 다음과 같습니다 infile.

2 4 6

를 사용하면 awk다음을 수행할 수 있습니다.

awk 'NR==FNR { split($0, to_delete); next }
             # split 'delete' file into an array called to_delete on default FS (white-space)
             { for (col in to_delete) $to_delete[col]=""; print }' delete infile
             # delete the columns from 'infile' that match with $column getting from array

그러면 파일에서 열 2, 4, 6이 제거된 출력이 제공됩니다.

0  0.000532  0.000465
0  1  -0.1146
0  0.0000967  -0.9972

답변2

이것이 당신이 찾고있는 것 같습니다 :

awk '
NR==FNR { split($0,del); next }
{
    out = sep = ""
    for (i=1; i<=NF; i++) {
        if ( !(i in del) ) {
            out = out sep $i
            sep = OFS
        }
    }
    print out
}
' delete.txt mat.txt

답변3

delete.txt에 행이 하나만 있다고 가정하면 다음 코드를 사용하여 필수 열을 가져올 수 있습니다.

$ perl -psale '$. == 1 and 
   @indices2P = grep { my $c=$_+1; $d !~ /\b$c\b/ } 0 .. $#F;
   $_ = "@F[@indices2P]";
' -- -d="$(< delete.txt)" mat.txt

결과:

0 0.000532 0.000465
0 1 -0.1146
0 0.0000967 -0.9972

설명하다:

제거할 열을 스칼라 변수에 저장하고 $d, mat.txt읽은 파일의 첫 번째 줄에 인쇄해야 하는 열 인덱스를 계산합니다.

그런 다음 @F인쇄를 위해 배열에 액세스할 때 이러한 인덱스만 적용됩니다.

답변4

$ < delete.txt \
       tr -s ' \t' '\n\n' | sort -nru |
       sed -e 's|.*|s/\\s*\\S+//&|' |
       sed -Ef - mat.txt

결과:

0 0.000532 0.000465
0 1 -0.1146
0 0.0000967 -0.9972

설명하다:

확장 정규식 모드가 설정된 GNU sed를 사용하여 먼저 mat.txt 파일에 적용할 때 원하는 출력을 제공하는 sed 코드를 생성합니다.

가정:

o The file delete.txt comprises only positive integers and max value < 512

관련 정보