Shell 脚本将文件中的前 3 个单词通过管道传输到新文件中,删除它们并循环

Shell script to pipe first 3 words from a file into a new file, remove them and loop

我有一个文本文件,在一个字符串中包含数百个 'FirstName LastName Email'。我需要将字符串分成每行 1 组

FirstName LastName Email
FirstName LastName Email
FirstName LastName Email

等等

我在将文件中的前 3 个单词通过管道传输到新文件后努力从文件中删除它们,这样当脚本循环时,它将读取接下来的 3 个,管道,删除等

awk '{print , , }' asd >> asd2 | cut -d' ' -f1-3 asd

我知道剪切不对,但老实说我找不到删除前 3 个单词的方法,我只找到 'sed' 删除整行。

这里不需要使用|符号。

awk '{print , , }' asd >> asd2; sed -i 's/^ *[^ ]\+ \+[^ ]\+ \+[^ ]\+//' asd

您可以在上面的命令中添加 [^[:blank:]] 而不是 [^ ]。将正则表达式更改为 's/^ *[^ ]\+ \+[^ ]\+ \+[^ ]\+ *//' 以删除第三个单词之后存在的空格。

#!/bin/bash
i=0
for WORD in $(cat asd)
do
    if [[ $i == 3 ]]
    then
        i=0
        printf '\n' >> asd2
    fi
    printf "%s" "$WORD " >> asd2
    i=$((i+1))
done

编辑:哇,我生疏了,写这个蹩脚的脚本花了我一些时间。

编辑:每三个词换行,但名称等不能有空格。

编辑:如果您的名字中有空格,那么您需要一个脚本来搜索“@”字符(用于电子邮件)并在该词后添加一个换行符。

如果你认输了awk,不妨使用ruby,一步到位:

ruby -e '$stdin.read.split.each_slice(3) {|x| puts x.join " "}'

使用xargs...

$  cat asd
FirstName1 LastName1 Email1 FirstName2 LastName2 Email2 FirstName3 LastName3 Email3 ...

$ xargs -n3 < asd
FirstName1 LastName1 Email1
FirstName2 LastName2 Email2
FirstName3 LastName3 Email3
...

xargs 语法:

xargs -nN [command=echo [args]]
  1. -n3 表示 运行 命令每次有 3 个参数。
  2. 如果未指定命令,则默认执行的命令是echo

立即生成最终文件

sed 's/\(\([^[:space:]]\{1,\}[[:space:]]\{1,\}\)\{2\}[^[:space:]]\{1,\}\)[[:space:]]\{1,\}/\
/g' Org.txt > NewFormated.txt

仅删除第 3 个单词(请求)

sed 's/\([^[:space:]]\{1,\}[[:space:]]\{1,\}\)\{2\}[^[:space:]]\{1,\}[[:space:]]\{1,\}//' Org.txt > New.txt

在这两种情况下,将 3 组非 space 分开 space(实际上是 2 + 1)并使用或删除它

这个 awk 应该一次性完成:

awk -vRS=" "  '{ORS=NR%3?RS:"\n"}1' asd 
FirstName LastName Email
FirstName LastName Email
FirstName LastName Email

通过设置RS为一个空格,一条记录就是一个单词。
然后将 ORS 设置为一个 space 或三个单词后换行。

可以缩短为:

awk -vRS=" " 'ORS=NR%3?RS:"\n"' asd