一个bourne shell程序,用于回显文件中的值

时间:2014-08-11 19:35:06

标签: bash shell

寻找一个bourne shell程序,它接受一个文件作为位置参数,并回显文件中的值以单列输出。

文件包含: 艾克曼,特洛伊雷诺兹,伯特史密斯,约翰琼斯,科林

目前我有这个但没有工作

#!/bin/sh 
if [ $# != 1 ] 
then 
echo usage: $0 FILE_NAME 
exit 1 
fi 

cat $1 

5 个答案:

答案 0 :(得分:1)

我认为您的意思是要读取文件,删除所有换行符并用逗号替换它们。 如果是这种情况,这应该有效:

#!/bin/bash 
if [ $# != 1 ]
then
        echo usage: $0 FILE_NAME
        exit 1
fi

sed ':a;N;$!ba;s/\n/,/g' $1

答案 1 :(得分:1)

使用awk

#!/bin/sh
if [ $# != 1 ]; then
    echo "usage: $0 FILE_NAME"
    exit 1
fi

awk -F, -v OFS='\n' '{$1=$1}1' "$1"

使用示例:

sh script.sh file

文件包含

aikman,troy reynolds,burt smith,john jones,colin

输出:

aikman
troy reynolds
burt smith
john jones
colin

答案 2 :(得分:0)

从文件

aikman,troy reynolds,burt smith,john jones,colin

grep -oP '\S+' filename

产生

aikman,troy
reynolds,burt
smith,john
jones,colin

grep -oP '\w+' filename

产生

aikman
troy
reynolds
burt
smith
john
jones
colin

grep -oP '[^,]+' filename

产生

aikman
troy reynolds
burt smith
john jones
colin

完整的脚本:

case $# in
1) grep -oP '[^,]+' "$1" ;;
*) echo "Usage: $0 filename";exit 1 ;;
esac

更好(接受许多文件名)

for file
do
    grep -oP '\S+' "$file"
done

答案 3 :(得分:0)

如果您希望每个空格分隔的值在一个单独的行上,

tr ' ' '\n' <file

会这样做。

并非tr的所有方言都将符号\n理解为换行符;试试\012或字面换行:

tr ' ' '
' <file

(是的,这是第二对单引号之间的字面换行符。)

更可持续的解决方案是将数据文件切换为每行一个名称,或者用一些不那么古怪的东西替换它。

答案 4 :(得分:0)

您可以使用Awk:

在单独的行上打印每个字段
awk '{for(i=1;i<=NF;i++) print $i}' "$1"

输出:

aikman,troy
reynolds,burt
smith,john
jones,colin