问题:
我有一个大文件,内容如下:
--- fruits_file.txt---
fruit:
apple
orange
fruit:
grapes
mango
fruit:
banana
cherries
--- fruits_file.txt---
fruit:
apple
orange
fruit:
grapes
mango
apple
fruit:
banana
cherries
apple
有没有简单的方法来实现这个?
答案1:
可以通过以下方式处理文件:
0.假定你的文件如下所示:
cat fruits_file.txt
fruit:
apple
orange
fruit:
grapes
mango
fruit:
banana
cherries
1.将文件的内容转换为单行:
paste -s -d ' ' fruits_file.txt
fruit: apple orange fruit: grapes mango fruit: banana cherries
2.将上面的命令的输出通过管道传递给sed
,并在字符串fruit:
之前放置新行,通过管道将输出传递给|
,
paste -s -d ' ' fruits_file.txt | sed 's/fruit:/nfruit:/g' | sed '/^s*$/d'
fruit: apple orange
fruit: grapes mango
fruit: banana cherries
3.将上面的命令的输出通过管道传递给awk
,以便将apple
附加到缺少该命令的行:
paste -s -d ' ' fruits_file.txt | sed 's/fruit:/nfruit:/g' | sed '/^s*$/d' |
awk '{if (!/apple/) {printf "%s applen", $0;} else print}'
fruit: apple orange
fruit: grapes mango
fruit: banana cherries
4.将上面的命令的输出通过管道传递给sed
,以便将(表达式1)多个空格替换为单个空格,而(表达式2)在每个空格后面追加
paste -s -d ' ' fruits_file.txt | sed 's/fruit:/nfruit:/g' | sed '/^s*$/d' |
awk '{if (!/apple/) {printf "%s applen", $0;} else print}' |
sed -r -e 's/s{1,9}/ /g' -e 's/s*$/ /'
fruit: apple orange
fruit: grapes mango apple
fruit: banana cherries apple
5.再次将上面的命令的输出通过管道传递给sed
,以便用换行符替换,然后通过管道将输出传递给head
,以便删除最后两行空行:
paste -s -d ' ' fruits_file.txt | sed 's/fruit:/nfruit:/g' | sed '/^s*$/d' |
awk '{if (!/apple/) {printf "%s applen", $0;} else print}' |
sed -r -e 's/s{1,9}/ /g' -e 's/s*$/ /' |
sed -e 's/s/n/g' -e 's/fruit:/fruit:n/' | head -n -2
fruit:
apple
orange
fruit:
grapes
mango
apple
fruit:
banana
cherries
apple
6.重定向上述命令的输出,并创建一个新文件:
paste -s -d ' ' fruits_file.txt | sed 's/fruit:/nfruit:/g' | sed '/^s*$/d' |
awk '{if (!/apple/) {printf "%s applen", $0;} else print}' |
sed -r -e 's/s{1,9}/ /g' -e 's/s*$/ /' |
sed -e 's/s/n/g' -e 's/fruit:/fruit:n/' | head -n -2
> fruits_new.txt
cat fruits_new.txt
fruit:
apple
orange
fruit:
grapes
mango
apple
fruit:
banana
cherries
apple
相关文章