행의 각 열에 문자열 추가 - 첫 번째 열 제외, 가변 행 길이, 각 행의 첫 번째 열에 포함된 문자열

행의 각 열에 문자열 추가 - 첫 번째 열 제외, 가변 행 길이, 각 행의 첫 번째 열에 포함된 문자열

여러 행/줄이 있는 파일이 있는데 각 행에는 다양한 수의 열이 포함되어 있습니다.

Name1 String111 String112
Name2 String121 String122 String123
Name3 String131 String132 String133 String134

등등(어느 행에 몇 개의 항목이 있는지에 대한 패턴은 없습니다). 첫 번째 열의 이름을 해당 행/행의 각 열 시작 부분에 추가하여 다음과 같이 끝내고 싶습니다.

Name1 Name1String111 Name1String112
Name2 Name2String121 Name2String122 Name2String123
Name3 Name3String131 Name3String132 Name3String133 Name3String134

간단하게 시작한 다음 더 복잡해질 수 있습니다.

각 열의 시작 부분에 "Test"와 같은 문자열을 어떻게 추가할 수 있나요?

열 1의 값을 열 1을 포함하여 행의 모든 ​​열에 어떻게 추가합니까?

열 1의 값을 행의 모든 ​​열(열 1 제외)에 어떻게 추가합니까?

내 추측은 다음과 같습니다.

"모든 열"을 호출하는 방법이나 명령이 현재 열에 액세스하도록 하는 방법을 모르기 때문에 열 1의 문자열이나 값을 다른 단일 열에만 추가할 수 있습니다.

awk -F'\t' -vOFS='\t' '{ !$1 = "hello" $2}' 
awk -F'\t' -vOFS='\t' '{ !$1 = $1 $2}' 

이 구문을 배울 수 있는 좋은 리소스가 있나요?

답변1

두 번째 필드부터 시작하여 모든 필드를 반복하고 첫 번째 필드를 이미 있는 필드에 결합하면 됩니다.

$ awk '{ for(i=2;i<=NF;i++){ $i = $1$i }}1' file
Name1 Name1String111 Name1String112
Name2 Name2String121 Name2String122 Name2String123
Name3 Name3String131 Name3String132 Name3String133 Name3String134

마지막으로 1awk의 "현재 줄 인쇄"의 약어입니다. 다음과 같이 동일한 내용을 작성할 수 있습니다.

$ awk '{ for(i=2;i<=NF;i++){ $i = $1$i }; print}' file
Name1 Name1String111 Name1String112
Name2 Name2String121 Name2String122 Name2String123
Name3 Name3String131 Name3String132 Name3String133 Name3String134

위의 기본 아이디어는 모든 예제와 일치하도록 간단히 확장할 수 있습니다. NF필드 수를 보유하는 특수 awk 변수입니다. 현재 행에 필드 수에 관계없이 항상 설정됩니다. 그러면 awk변수를 사용하여 특정 필드를 참조할 수 있습니다. 따라서 을 설정하면 i=5$i같습니다 $5. 그런 다음 for(i=2;i<=NF;i++) { }모든 숫자를 해당 행의 필드 수로 설정하는 형식을 사용하여 모든 필드를 반복할 수 있습니다 .i2

답변2

첫 번째 필드를 포함할 수 없는 경우 &필요한 것은 다음과 같습니다.

$ awk '{gsub(/[[:space:]]+/,"&"$1)}1' file
Name1 Name1String111 Name1String112
Name2 Name2String121 Name2String122 Name2String123
Name3 Name3String131 Name3String132 Name3String133 Name3String134

답변3

어떤 경우에도:

awk '{ OFS=" "$1; $1=$1 }1' infile

그러면 OFS가 다음과 같이 설정됩니다.<SPC><first-column's-value>그런 다음 필드는 OFS에 대해 재평가되어 $1=$1인쇄됩니다(참조:엉뚱한 관용구 1).

다음과 같이 쓸 수도 있습니다.

awk '{ OFS=" "$1 } $1=$1' infile

...그러나 첫 번째 필드가 있는 행에서는 실패합니다 0. 여기서는 빈 문자열을 사용하여 ""강제 할 수 있습니다.문자열 할당의 경우 할당 결과는 $1=$1""항상 true로 평가되므로 할당 결과가 true가 되며 기본 인쇄 작업도 다음 줄에 대해 트리거됩니다.

awk '{ OFS=" "$1 } $1=$1""' infile

관련 정보