我应该在Linux中使用哪个shell脚本来用一行替换n行文本的组?
我有一个类似的文件:
a
b
c
*
d
e
f
*
g
h
i
*
我希望得到一个文件:
abc
def
ghi
答案 0 :(得分:2)
可以使用awk
awk '{if ($0=="*"){print s;s=""}else{s=s$0}}' file
bash方式是
while read x
do
[ "$x" == "*" ] && echo || echo -n $x
done < file
答案 1 :(得分:2)
sed方式:
sed ':a;N;$!ba;s/\n//g' < t | sed 's:*:\n:g'
t是您要更改的文件。
的引用: How can I replace a newline (\n) using sed? Why does sed not replace all occurrences?
第一个命令没有替换\ n。第二个用\ n替换*。
顺便说一句,sed是一个非常强大的流编辑器工具,知道它可以以比你想象的更多的方式帮助你。答案 2 :(得分:1)
除了awk解决方案:
tr '\n' ' ' < Input.txt |sed 's/ //g' | tr '*' '\n'
答案 3 :(得分:0)
一种awk
方式:
$ awk '/\*/ {printf "\n"; next} {printf $1}' file
abc
def
ghi
*
,请打印一个新行。否则,打印角色。使用printf
,除非指定,否则不添加新行。使用xargs
:
$ xargs -n4 < file | cut -d' ' -f1-3
a b c
d e f
g h i
xargs -n4 < file
以4列为单位打印文件。 cut -d' ' -f1-3
从第1列打印到第3列。答案 4 :(得分:0)
如果您将*
视为行代码,请尝试删除'\ n'并替换STAR。
cat <youfile> | tr -d '\n' | tr '*' '\n'
答案 5 :(得分:0)
你可以在没有awk,tr或外部任何东西的shell中做到这一点:
#!/bin/bash
while read x
do
if [ "$x" == "*" ]; then
echo $line
line=""
else
line="$line$x"
fi
done
另存为“go”,然后执行:
chmod +x go
./go <inputfile
答案 6 :(得分:0)
我相信tr可以被认为是替换单个字符的正确工具。
tr -d '\n' < file | tr '*' '\n'
在这种情况下纠正将意味着最轻量级,最不笨拙,最不容易出错,并且对此目的的认知要求最低。其他解决方案有效,但tr的隐藏成本最低。当你在unix中使用很多小工具时,这些小优点确实会随着时间的推移而增加。
答案 7 :(得分:0)
感谢大家,我发现这个解决方案适用于文件
的情况field1 2008
field2 703
field3 qeew
field4 80
field5 52
field6 749.11
field1 2009
field2 532
field3 wecwer
field4 82
field5 44
field6 649.97
...
#!/bin/bash
if [ "$1" = "" ]
then
echo "missing file name"
exit 1
fi
N=7
i=0
FULL_ROW=""
SAVEIFS=$IFS
if [ -f $1 -a -r $1 ]; then
LAST_DATA_SCAD=""
while IFS=$(echo -en "|\n\b") read -ra ROW_RECORD; do
if [[ "$FULL_ROW" == "" ]]
then
FULL_ROW=${ROW_RECORD:11}
else
FULL_ROW=$FULL_ROW"|"${ROW_RECORD:11}
fi
i=$((i+1))
if [ $((10#$i)) == $N ]
then
echo $FULL_ROW
FULL_ROW=""
i=0
fi
done < "$1"
else
echo "file not found"
fi
IFS=$SAVEIFS