
두 문자열을 한 줄로 결합하여 |
구분 기호로 사용하고 싶습니다. 을 사용하여 병합할 수 있습니다 . 구분 기호로 사용하여 문자열을 병합 awk '{$1,$2,$3$4$5}'
하는 다른 방법이 있습니까 ?|
입력하다:
XXXXXXXX 0 Xxyxhsag | yuiji
산출:
XXXXXXXX 0 Xxyxhsag|yuiji
답변1
데이터에 로 구분된 필드가 포함되어 있고 |
구분 기호 |
문자의 양쪽에 공백이 포함될 수 있다고 가정합니다. 그런 다음 사용할 입력 필드 구분 기호 awk
는 표현식, 즉 문자 및 측면 공백과 일치하는 표현식입니다 *[|] *
.|
단일 문자를 |
출력 필드 구분 기호로 사용하고 awk
출력 레코드를 강제로 다시 생성하면(필드 중 하나를 설정하여) 적어도 질문에서 요청한 방식으로 문제가 해결됩니다.
awk -F ' *[|] *' -v OFS='|' '{ $1=$1 }; 1' file
또는 동등하게,
awk -F ' *[|] *' -v OFS='|' '{ $1=$1; print }' file
이것을 테스트해 보세요:
$ cat file
XXXXXXXX 0 Xxyxhsag | yuiji
$ awk -F ' *[|] *' -v OFS='|' '{ $1=$1 }; 1' file
XXXXXXXX 0 Xxyxhsag|yuiji
sed
표현식과 유사한 대체를 사용할 수도 있습니다.
$ sed 's/ *| */|/g' file
XXXXXXXX 0 Xxyxhsag|yuiji
이는 모두 인용된 필드에 구분 기호, 줄 바꿈 또는 따옴표가 포함되지 않은 텍스트 또는 "간단한" CSV 데이터로 데이터를 처리할 수 있다고 가정합니다.
답변2
입력 데이터가 주어지면,
XXXXXXXX 0 Xxyxhsag | one
XXXXXXXX 0 Xxyxhsag | two
XXXXXXXX 0 Xxyxhsag|third
기본 구분 기호
기본 awk
구분 기호(하나 이상의 연속 공백 또는 탭)를 사용합니다.
awk '{print $1,$2,$3$4$5}' v
XXXXXXXX 0 Xxyxhsag|one
XXXXXXXX 0 Xxyxhsag|two
XXXXXXXX 0 Xxyxhsag|third
세 번째 필드의 변경 사항을 확인하세요.
awk '{printf "3th:[%s]\n",$3}' v
3th:[Xxyxhsag]
3th:[Xxyxhsag]
3th:[Xxyxhsag|third]
실제 상황에 항상 5개의 필드가 있는 경우 이것이 해결책이 될 수 있습니다.
파이프(|) 구분 기호
구분 기호 로 사용할 수 있지만 |
이렇게 하면 필드의 공간이 보존됩니다.
awk -F\| '{printf "%s|%s\n", $1, $2}' v
XXXXXXXX 0 Xxyxhsag | one
XXXXXXXX 0 Xxyxhsag | two
XXXXXXXX 0 Xxyxhsag|third
출력 구분 기호를 다음으로 변경하면 더 명확해질 수 있습니다.!
awk -F\| '{printf "%s!%s\n", $1, $2}' v
XXXXXXXX 0 Xxyxhsag ! one
XXXXXXXX 0 Xxyxhsag ! two
XXXXXXXX 0 Xxyxhsag!third
$1
이제 후행 공백을 제거 하고 공백을 선행 해야 하기 때문에 많은 이점이 없습니다 $2
.
답변3
당신은 awk
시도 할 수 있습니다:
awk -F'|' -v OFS='|' '{sub(/ \| /,"|")} 1' file
XXXXXXXX 0 Xxyxhsag|yuiji
- FS와 OFS를 설정했습니다(동일한 값입니다
|
:) - 그래야만 다음과 같은 결과를 얻을 수 있습니다.
awk -F'|' -v OFS='|' '1' file
XXXXXXXX 0 Xxyxhsag | yuiji
|
따라서 다음을 사용하여 주변의 공백을 제거합니다sub()
.
{sub(/ \| /,"|")}