여러 개의 공백을 하나로 바꾸려면 'tr'을 사용하세요.

여러 개의 공백을 하나로 바꾸려면 'tr'을 사용하세요.

파일이 있습니다 f1.txt.

ID     Name
1      a
2         b
3   g
6            f

공백의 수는아니요안정적인. 모든 공백을 하나의 공백으로 바꾸는 가장 좋은 방법은 무엇입니까 tr?

이것이 내가 지금까지 가지고 있는 것입니다:

cat f1.txt | tr -d " "

그러나 출력은 다음과 같습니다.

IDName
1a
2b
3g
6f

하지만 나는 다음과 같이 보이기를 원합니다.

ID Name
1 a
2 b
3 g
6 f

그것을 피하십시오 sed.

답변1

와 함께 tr, 사용하다s압출반복 옵션:

$ tr -s " " < file
ID Name
1 a
2 b
3 g
6 f

또는 다음 솔루션을 사용할 수 있습니다 awk.

$ awk '{$2=$2};1' file
ID Name
1 a
2 b
3 g
6 f

레코드의 필드를 변경하면 awk다시 작성은 $0모든 필드를 가져와 OFS기본적으로 공백으로 구분하여 함께 연결합니다.

이는 일련의 공백과 탭(로케일 및 구현에 따라 다른 공백 문자도 가능 awk)을 단일 공백으로 압축하는 동시에 각 줄에서 선행 및 후행 공백을 제거합니다.

답변2

그냥 사용column:

column -t inputFile

산출:

ID  Name
1   a
2   b
3   g
6   f

답변3

"공백"을 압축하려면 tr의 미리 정의된 문자 집합 ":blank:"(가로 공백 탭 및 공백) 또는 ":space:"(세로 공백)를 사용해야 합니다.

/bin/echo -e  "val1\t\tval2   val3" | tr -s "[:blank:]"

예제는 Red Hat 5(GNU tr)에서 실행됩니다.

내 경우에는 공백을 구분 기호로 사용할 수 있도록 모든 공백을 단일 공백으로 정규화하고 싶습니다.

dastrobu의 두 번째 의견에서 지적했듯이 매뉴얼 페이지의 문구를 놓쳤습니다.

 -s uses the last specified SET, and occurs after translation or deletion.

이를 통해 첫 번째 tr을 제거할 수 있습니다. 내 서투른 모습에 쿠도는 너무 조급해했다.

이전에는 Redis 구성에서 포트가 확인되었습니다. 문서:

grep "^port" $redisconf | tr "[:blank:]" " " | tr -s "[:blank:]"  | cut -d" " -f2

그런 다음 다음을 눌러 SET2를 지정하십시오.

grep "^port" $redisconf | tr -s "[:blank:]" " " | cut -d" " -f2

산출:

6379

공백의 미묘한 차이에 대한 자세한 내용

[:blank:] 문자 클래스에 속하는 연속 혼합 문자가 포함될 때 압착만으로는 실패함을 보여줍니다.

 /usr/bin/printf '%s \t %s' id myname | tr -s "[:blank:]"  | od -cb
0000000   i   d      \t       m   y   n   a   m   e
        151 144 040 011 040 155 171 156 141 155 145
0000013

참고: 내 printf 형식에는 공백 1개, 탭 1개, 공백 1개로 구분된 두 개의 문자열 필드가 있습니다. 시퀀스는 압출 후에도 지속됩니다. 8진수 덤프의 출력에서 ​​이는 ASCII 시퀀스 040 011 040으로 표시됩니다.

답변4

이것은 여러 번 해결된 오래된 문제입니다. 완전성을 위해: 비슷한 문제가 있지만 다른 프로그램에 라인을 파이프하고 싶습니다. 나는 사용했다매개변수.

-L max-lines
   Use at most max-lines nonblank input lines per command line.
   Trailing blanks cause an input line to be logically continued 
   on the next input line.  Implies -x.

따라서 cat f1.txt | xargs -L1출력이 정확히 원하는 것 같습니다.

관련 정보