줄의 네 번째 단어를 가져와서 줄의 시작 부분에 복사해야 합니다(sed awk).

줄의 네 번째 단어를 가져와서 줄의 시작 부분에 복사해야 합니다(sed awk).

500만 줄의 파일이 있습니다.

xx ss ss "abcde"

"abcde"각 줄의 시작 부분에 복사 해야 합니다 .

"abcde" xx ss ss "abcde"

문자열은 "abcde"각 줄마다 바뀌므로 특정 단어는 아니지만 항상 각 줄의 4번째 단어입니다.

답변1

대안 awk :

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]목록 구분 기호 $"(기본값은 )와 함께 4번째 필드를 배치합니다 . space옵션 은 기록 -p됩니다 .autoprint

perl -pale 's/^/$F[3]$"/' yourfile

sed 명령을 사용하여 원본의 복사본을 저장하고 네 번째 필드를 차단합니다. 그런 다음 앞 부분을 제거합니다. 그리고 현재 4번째 필드를 보유하고 있는 패턴 공간에 추가하여 원본을 복원합니다.

sed -e '
   /\n/!h
   //!s/\S\+/\n&\n/4
   /\n.*\n/D
   s/\n.*//;G;s/\n/ /
' yourfile

관련 정보