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