問題:
我有一個大文件,內容如下:
--- 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
相关文章