파일이 있습니다 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
답변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
출력이 정확히 원하는 것 같습니다.