다음과 같이 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