중복된 줄을 제거하라는 명령을 내리지만 .txt 파일에 일부 변경 사항이 있습니다.

중복된 줄을 제거하라는 명령을 내리지만 .txt 파일에 일부 변경 사항이 있습니다.

.txt 파일의 데이터 세트에서 중복 행을 제거하려면 어떻게 해야 합니까? 문제는 내 행의 절반이 중복이고 첫 번째 RESULT 행만 필요하다는 것입니다. 명령을 사용해 보았지만 제대로 작동하지 않았습니다.

sort myfile.txt uniq -u | newfile.txt

이것은 내 파일의 내용입니다. 내 파일의 줄 수는 299873입니다.

ligand_06278/out.pdbqt:REMARK  Name = 22626427
ligand_06278/out.pdbqt:REMARK VINA RESULT:      -8.3      2.094      2.612
ligand_06278/out.pdbqt:REMARK VINA RESULT:      -8.3      2.821      8.000
ligand_06278/out.pdbqt:REMARK VINA RESULT:      -8.4      3.333      6.628
ligand_06278/out.pdbqt:REMARK VINA RESULT:      -8.4      4.526      7.557
ligand_06278/out.pdbqt:REMARK VINA RESULT:      -8.5      2.500      4.835
ligand_06278/out.pdbqt:REMARK VINA RESULT:      -8.5      2.516      7.135
ligand_06278/out.pdbqt:REMARK VINA RESULT:      -8.6      2.660      7.148
ligand_06278/out.pdbqt:REMARK VINA RESULT:      -8.8      3.141      6.023
ligand_06278/out.pdbqt:REMARK VINA RESULT:      -8.9      0.000      0.000
ligand_06279/out.pdbqt:REMARK  Name = 22629712
ligand_06279/out.pdbqt:REMARK VINA RESULT:      -6.1      9.841     13.115
ligand_06279/out.pdbqt:REMARK VINA RESULT:      -6.3     15.483     18.543
ligand_06279/out.pdbqt:REMARK VINA RESULT:      -6.3      1.944      5.962
ligand_06279/out.pdbqt:REMARK VINA RESULT:      -6.3      8.946     12.260
ligand_06279/out.pdbqt:REMARK VINA RESULT:      -6.5     14.453     17.240
ligand_06279/out.pdbqt:REMARK VINA RESULT:      -6.8     10.330     14.145
ligand_06279/out.pdbqt:REMARK VINA RESULT:      -6.8      1.727      5.848
ligand_06279/out.pdbqt:REMARK VINA RESULT:      -7.1      7.429     11.509
ligand_06279/out.pdbqt:REMARK VINA RESULT:      -7.3      0.000      0.000
ligand_06280/out.pdbqt:REMARK  Name = 22631372
ligand_06280/out.pdbqt:REMARK VINA RESULT:     -10.0      3.811      7.264
ligand_06280/out.pdbqt:REMARK VINA RESULT:     -10.1      0.000      0.000
ligand_06280/out.pdbqt:REMARK VINA RESULT:      -9.3      5.006      9.020
ligand_06280/out.pdbqt:REMARK VINA RESULT:      -9.4      2.195      8.687
ligand_06280/out.pdbqt:REMARK VINA RESULT:      -9.4      2.712      9.301
ligand_06280/out.pdbqt:REMARK VINA RESULT:      -9.6      2.186      8.354
ligand_06280/out.pdbqt:REMARK VINA RESULT:      -9.7      5.168      7.981
ligand_06280/out.pdbqt:REMARK VINA RESULT:      -9.8      1.961      2.580
ligand_06280/out.pdbqt:REMARK VINA RESULT:      -9.8      2.311      8.341

답변1

$ awk -F: '$1 != p && /RESULT/ { print; p = $1 }' file
ligand_06278/out.pdbqt:REMARK VINA RESULT:      -8.3      2.094      2.612
ligand_06279/out.pdbqt:REMARK VINA RESULT:      -6.1      9.841     13.115
ligand_06280/out.pdbqt:REMARK VINA RESULT:     -10.0      3.811      7.264

RESULT그러면 입력 파일에 언급된 각 파일의 첫 번째 줄이 출력됩니다. 첫 번째 열(파일 이름)을 이전 줄의 첫 번째 열과 비교하고 현재 줄에 단어가 포함되어 있는지 테스트하여 이를 수행합니다 RESULT. 이전 줄과 파일 이름이 다른 줄이 발견되면 해당 줄은 업데이트된 RESULT값으로 그대로 인쇄됩니다.p


입력 파일이 grep여러 파일을 실행한 결과(아마도 grep search ) 와 매우 유사하다는 것을 알았습니다 REMARK.

모든 파일을 찾고 각 파일과 일치하는 첫 번째 줄을 얻으려면 다음을 수행하십시오 REMARK VINA RESULT.

find . -type f -path './ligand_*' -name 'out.pdbqt' -exec sed -n '/REMARK VINA RESULT/{p;q;}' {} ';'

또는 간단한 루프로:

for name in ligand_*/out.pdbqt; do
    grep -F 'REMARK VINA RESULT' "$name" | head -n 1
done

저는 여기서 다양한 방법을 사용했는데, 가장 자연스럽게 느껴지는 방법을 선택하세요.

답변2

다음 줄( )을 grep포함 하고 출력을 전달하여 이러한 줄을 제거 할 수 있습니다 .Name=-A1grep RESULTName=

$ grep -A1 'Name =' file | grep RESULT
ligand_06278/out.pdbqt:REMARK VINA RESULT:      -8.3      2.094      2.612
ligand_06279/out.pdbqt:REMARK VINA RESULT:      -6.1      9.841     13.115
ligand_06280/out.pdbqt:REMARK VINA RESULT:     -10.0      3.811      7.264

관련 정보