我有一个超过6000行的input.txt文件。
如果一行a的单词超过10个,那么我希望将其拆分,而不是第10个单词,而是第一个逗号出现的位置。而且,如果新行也有10个以上的单词,则也应将其拆分,并重复7次。
最终产品:没有超过10个单词和逗号的行,因为它们都被分割了。
示例:
输入
Line 1: This is me, and my sample test line that I like to get working, and I want to be able to kick some ass while doing it
预期输出:
Line 1: This is me,
Line 2: and my sample test line that I like to get working,
Line 3: and I want to be able to kick some ass while doing it
我正在使用以下代码:
#! /bin/bash
for run in {1..7}
do
awk 'NF >= 10 {
sub (", ", ",\n")
}1' input.txt
done
此代码未提供期望的结果。相反,我得到以下输出7次。
line 1: This is me,
line 2: and my sample test line that I like to get working, and I want to be able to kick some ass while doing it.
我倾向于sed,但是我不清楚。我看到了三种方法:1)代码读取一行(例如line7),它超过10个单词,并以逗号将其断开(但不检查新断开的文本是否超过10个单词),然后移至下一行。在文件末尾,它将重复此过程(例如7次),以确保新断行也少于10个字。然后,它将获取此过程的输出,并执行相同的操作,但条件是新的(例如单词“ and”)。然后,它需要这个的输出,依此类推...我可以添加无尽的条件。这是我更喜欢的方法。我还认为编码更容易。
第二种方法2)是该代码读取行,如果超过10个单词,则将其分解为逗号,如果超过10个单词,则将其分解为逗号,以此类推,直到少于10个单词。只有然后,它才继续前进到下一行。我认为这就是Ghoti的代码所做的。但是添加其他条件很复杂。 3)第三种方法是:用逗号将超过10个单词的行换行,然后将其余行换成“和”,依此类推。最后,整个过程需要重复几次。这也是恕我直言,不是最好的方法。
有人可以帮忙吗?
提前谢谢!
答案 0 :(得分:3)
我想我明白你的追求了。您的方法存在一些问题:
sub()
进行了更改,1
打印到标准输出,但是您的输入文件从未更改。sub()
时,您不会在awk正在处理的输入流中插入新记录。您的命令仅向当前记录添加换行符。鉴于这些,您可以像建议的那样多次处理输入。但是,与其随意假设一行上最多有七个10个单词的短语,不如实际检测是否需要继续。像这样:
#!/usr/bin/env bash
input=input.txt
temp=$(mktemp ${input}.XXXX)
trap "rm -f $temp" 0
while awk '
BEGIN { retval=1 }
NF >= 10 && /, / {
sub(/, /, ","ORS)
retval=0
}
1
END { exit retval }
' "$input" > "$temp"; do
mv -v $temp $input
done
这使用awk的退出值来确定是否需要运行bash循环的另一次迭代。如果awk检测到不需要替换,则循环停止。
答案 1 :(得分:0)
好的,这就是我解决此问题的方法。很难看,但是可以用。另外,我可以继续传递更多sed命令以添加更多条件(例如我在@ghoti上方的评论)。
sed -r '/((\w)+[., ]+){10}/s/\./\.\n/' input.txt | sed -r '/((\w)+[., ]+){10}/s/\./\.\n/' | sed -r '/((\w)+[., ]+){10}/s/\./\.\n/' | sed -r '/((\w)+[., ]+){10}/s/\./\.\n/'| sed -r '/((\w)+[., ]+){10}/s/\./\.\n/' | sed -r '/((\w)+[., ]+){10}/s/\./\.\n/' | sed -r '/((\w)+[., ]+){10}/s/\./\.\n/' | tr -s [:space:] > output.txt
基本上,我只是用管道传输了7次相同的sed命令(在上面的示例中,我要替换句点而不是逗号,但是都一样)。 基于我在网上阅读的内容,我很惊讶此命令不允许进行某些递归/重复。或者,如果有人知道,请随时进行编辑。