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]]
-n3
表示 运行 命令每次有 3 个参数。
- 如果未指定命令,则默认执行的命令是
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
我有一个文本文件,在一个字符串中包含数百个 '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]]
-n3
表示 运行 命令每次有 3 个参数。- 如果未指定命令,则默认执行的命令是
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