我在一个字符串中有一个包含数百个'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'删除整行。
答案 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]]
-n3
表示每次运行3个参数的命令。 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)并使用或删除它