需要取出一行的第四個單字並將其複製到行的開頭(sed awk)

需要取出一行的第四個單字並將其複製到行的開頭(sed awk)

我有一個包含 500 萬行的文件:

xx ss ss "abcde"

我需要將"abcde"其複製到每行的開頭:

"abcde" xx ss ss "abcde"

該字串"abcde"在每一行中都會發生變化,因此它不是一個特定的單詞,但它始終是每行中的第四個單詞。

答案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在替換字串中引用。將&整個匹配項放入替換中,因此第四列插入到該行的整個剩餘部分之前。

請注意,這適用於四列以上,但如果沒有第四列,則會失敗。

當擴充正規表示式可用時相同(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

相關內容