Shell脚本将文件中的前3个单词输入新文件,删除它们并循环

时间:2015-02-03 02:24:36

标签: bash shell awk sed

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

FirstName LastName Email
FirstName LastName Email
FirstName LastName Email

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

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

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

6 个答案:

答案 0 :(得分:3)

使用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. 如果未指定command,则执行的默认命令为echo

答案 1 :(得分:3)

这个awk应该一次完成:

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

通过将RS设置为一个空白,一个记录就是一个单词 然后将ORS设置为三个单词之后的一个空格或新行。

可以将一些缩短为:

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

答案 2 :(得分:0)

您无需在此处使用|符号。

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

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

答案 3 :(得分:0)

#!/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

编辑:哇,我生气了,我花了一些时间来写这个糟糕的剧本。

编辑:这会将每三个单词放在一个新行上,但名称等不能有空格。

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

答案 4 :(得分:0)

如果你承认awk,你可以使用ruby并一步到位得到答案:

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

答案 5 :(得分:0)

立即生成最终文件

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

仅删除3个第一个字(请求)

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

在这两种情况下都将3组非空格分隔为空格(事实上为2 + 1)并使用或删除它