500만 줄의 파일이 있습니다.
xx ss ss "abcde"
"abcde"
이것을 각 줄의 시작 부분에 복사 해야 합니다 .
"abcde" xx ss ss "abcde"
문자열은 "abcde"
줄마다 바뀌므로 특정 단어는 아니지만 항상 각 줄의 네 번째 단어입니다.
답변1
또 다른 이상한:
awk '{print $4,$0}' file
시험:
$ cat file7
abc def ghi nop
klm one two three
four five six nine
$ awk '{print $4,$0}' file7
nop abc def ghi nop
three klm one two three
nine four five six nine
답변2
의 경우 sed
열이 여러 공백으로 구분되어 있고 추가 열이 있을 수 있다고 가정합니다.
sed 's/\([^ ]* *\)\{3\}\([^ ]*\)/\2 &/'
이 패턴은 공백이 아닌 것으로 식별되는 세 개의 반복 열과 일치하며 그 뒤에는 공백, 그 뒤에 \2
대체 문자열에 인용된 다른 열이 옵니다. 전체 일치 항목을 대체 항목에 추가 하면 &
행의 나머지 전체 앞에 네 번째 열이 삽입됩니다.
이 방법은 4개 이상의 열에서 작동하지만 네 번째 열이 없으면 실패합니다.
확장 정규 표현식을 사용할 수 있는 경우에도 동일합니다(FreeBSD 또는 GNU sed
):
sed -E 's/([^ ]* *){3}([^ ]*)/\2 &/'
답변3
여기에 더 나은 답변이 있지만 다음은 작동하는 for in 루프도 있습니다.
IFS=$'\n'; for i in $(cat file); do var=$(echo $i | awk '{print $4}') ; sed -i "s/.*$var/$var &/g" file ;done
답변4
네 번째 필드를 목록 구분 기호 (기본값 ) $F[3]
와 함께 레코드/행의 시작 부분에 배치합니다 . 이 옵션은 기록됩니다.$"
space
-p
autoprint
perl -pale 's/^/$F[3]$"/' yourfile
sed 명령을 사용하여 원본 파일의 복사본을 저장하고 네 번째 필드를 분리합니다. 그런 다음 주요 부분을 제거합니다. 이제 네 번째 필드가 포함된 패턴 공간에 추가하여 원래 상태를 복원합니다.
sed -e '
/\n/!h
//!s/\S\+/\n&\n/4
/\n.*\n/D
s/\n.*//;G;s/\n/ /
' yourfile