여러 행/줄이 있는 파일이 있는데 각 행에는 다양한 수의 열이 포함되어 있습니다.
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
마지막으로 1
awk의 "현재 줄 인쇄"의 약어입니다. 다음과 같이 동일한 내용을 작성할 수 있습니다.
$ 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++) { }
모든 숫자를 해당 행의 필드 수로 설정하는 형식을 사용하여 모든 필드를 반복할 수 있습니다 .i
2
답변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