需要取出一行的第四个单词并将其复制到行的开头(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

相关内容