텍스트 파일에서 공백과 하이픈 제거

텍스트 파일에서 공백과 하이픈 제거

내 현재 텍스트 파일은 다음과 같습니다.

VOG0005              -          k141_44786_1         -            4.9e-11   41.0   0.0     2e-08   32.4   0.0   2.0   2   0   0   2   2   2   2 -   
VOG0005              -          k141_46357_20        -            9.2e-44  148.8   1.7   2.4e-32  111.2   0.2   3.0   2   1   1   3   3   3   3 -   
VOG0010              -          k141_1081_2          -            1.2e-06   27.4   0.5   0.00011   21.0   0.0   2.3   2   0   0   2   2   2   2 -
VOG0010              -          k141_17432_67        -            1.2e-07   30.7   0.0   1.7e-07   30.2   0.0   1.3   1   1   0   1   1   1   1 -
VOG0010              -          k141_2610_7          -            2.1e-06   26.6   0.0   2.9e-06   26.2   0.0   1.1   1   0   0   1   1   1   1 

명령 은 sort하이픈과 중간 공백을 별도의 열로 계산합니까? 그렇다면 cut해당 명령을 사용하는 사이에 하이픈을 어떻게 제거할 수 있습니까?

VOG0005 - k141_44786_1 - 4.9e-11

이런 것을 얻으세요

VOG0005 k141_44786_1 4.9e-11

즉, 하나의 공간만 나에게 적합합니다. 다음 명령을 시도했지만 cut -f2 File.txt내 경우에는 작동하지 않는 것 같습니다.

누구든지 도와줄 수 있나요?

답변1

sed 명령을 사용하여 spac에서 하이픈을 제거할 수 있습니다.

sed 's/- //g'

아래 예시를 참고해주세요

# cat example.txt
VOG0005 - k141_44786_1 - 4.9e-11 41.0 0.0 2e-08 32.4 0.0 2.0 2 0 0 2 2 2 2 -
VOG0005 - k141_46357_20 - 9.2e-44 148.8 1.7 2.4e-32 111.2 0.2 3.0 2 1 1 3 3 3 3 -
VOG0010 - k141_1081_2 - 1.2e-06 27.4 0.5 0.00011 21.0 0.0 2.3 2 0 0 2 2 2 2 -
VOG0010 - k141_17432_67 - 1.2e-07 30.7 0.0 1.7e-07 30.2 0.0 1.3 1 1 0 1 1 1 1 -
VOG0010 - k141_2610_7 - 2.1e-06 26.6 0.0 2.9e-06 26.2 0.0 1.1 1 0 0 1 1 1 1 -

# sed 's/- //g' example.txt
VOG0005 k141_44786_1 4.9e-11 41.0 0.0 2e-08 32.4 0.0 2.0 2 0 0 2 2 2 2 -
VOG0005 k141_46357_20 9.2e-44 148.8 1.7 2.4e-32 111.2 0.2 3.0 2 1 1 3 3 3 3 -
VOG0010 k141_1081_2 1.2e-06 27.4 0.5 0.00011 21.0 0.0 2.3 2 0 0 2 2 2 2 -
VOG0010 k141_17432_67 1.2e-07 30.7 0.0 1.7e-07 30.2 0.0 1.3 1 1 0 1 1 1 1 -
VOG0010 k141_2610_7 2.1e-06 26.6 0.0 2.9e-06 26.2 0.0 1.1 1 0 0 1 1 1 1 -

답변2

와 유사하게 다음을 sed사용할 수도 있습니다 perl.

$ cat File.txt | tr -s " " | perl -pe 's/[[:space:]]-//g' | sponge File.txt
VOG0005 k141_44786_1 4.9e-11 41.0 0.0 2e-08 32.4 0.0 2.0 2 0 0 2 2 2 2
VOG0005 k141_46357_20 9.2e-44 148.8 1.7 2.4e-32 111.2 0.2 3.0 2 1 1 3 3 3 3
VOG0010 k141_1081_2 1.2e-06 27.4 0.5 0.00011 21.0 0.0 2.3 2 0 0 2 2 2 2
VOG0010 k141_17432_67 1.2e-07 30.7 0.0 1.7e-07 30.2 0.0 1.3 1 1 0 1 1 1 1
VOG0010 k141_2610_7 2.1e-06 26.6 0.0 2.9e-06 26.2 0.0 1.1 1 0 0 1 1 1 1

또는

<File.txt tr -s " " | perl -pe 's/[[:space:]]-//g' | sponge File.txt

# on fish shell
tr -s " " <File.txt | perl -pe 's/[[:space:]]-//g' | sponge File.txt

설명하다

tr -s " "                    
# Removes extra spaces
perl -pe 's/[[:space:]]-//g' 
# Replaces any ' -' with nothing
sponge File.txt              
# Reads standard input and writes it out to the specified file.

분명히 그냥 사용할 수 있습니다 perl(@ 감사합니다스티븐 차제라스):

perl -pi -e 's/ +/ /g; s/[[:space:]]-//g' File.txt

마찬가지로 sed:

sed -i -E 's/ +/ /g; s/[[:space:]]-//g' File.txt

설명은 @Stéphane Chazelas 댓글을 참조하세요.

답변3

첫째, 그렇습니다. sort첫 번째는 열 2로 처리되고 -, 첫 번째는 k141_xxxx열 3으로, 두 번째는 -열 4로 처리됩니다. 그러나 이것은 불완전한 단순화입니다. 진실은 미묘하고 복잡합니다.

귀하의 질문이 완전히 명확하지 않습니다. 두 번째와 네 번째 열을 파괴하려면 다음을 수행하십시오.

awk '{ $2=""; $4=""; print }' example.txt

하이픈으로 필드를 분리하려면 다음을 수행하십시오.

awk '{for (i=1; i<=NF; i++) if ($i == "-") $i = ""; print}' example.txt

awk그것은 과잉입니다(그러나 그렇습니다 perl).

관련 정보