.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=
-A1
grep RESULT
Name=
$ 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