我有一個包含 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