Bash脚本从数组中获取项目

时间:2012-11-07 15:24:39

标签: bash

我正试图在bash中逐行读取文件。

每一行的格式如下text|number

我想生成格式如下text,text,text等文件,因此新文件只包含以逗号分隔的上一个文件中的文本。

以下是我尝试过但无法使用的内容:

FILENAME=$1

OLD_IFS=$IFSddd
IFS=$'\n'
i=0
for line in $(cat "$FILENAME"); do
    array=(`echo $line | sed -e 's/|/,/g'`)
    echo ${array[0]}
    i=i+1;
done
IFS=$OLD_IFS

但是这会打印文本和数字,但格式不同text number

这里是示例输入:

dsadadq-2321dsad-dasdas|4212
dsadadq-2321dsad-d22as|4322

这里是示例输出:

dsadadq-2321dsad-dasdas,dsadadq-2321dsad-d22as

我做错了什么?

4 个答案:

答案 0 :(得分:1)

不需要数组和sed

while IFS='' read line ; do
    echo -n "${line%|*}",
done < "$FILENAME"

您只需删除最后一个逗号: - )

答案 1 :(得分:1)

不是纯粹的bash,但你可以在awk中执行此操作:

awk -F'|' 'NR>1{printf(",")} {printf("%s",$1)}'

或者,在纯粹的bash中,无需删除最后的逗号:

#/bin/bash

# You can get your input from somewhere else if you like. Even stdin to the script.
input=$'dsadadq-2321dsad-dasdas|4212\ndsadadq-2321dsad-d22as|4322\n'

# Output should be reset to empty, for safety.
output=""

# Step through our input.  (I don't know your column names.)
while IFS='|' read left right; do
  # Only add a field if it exists.  Salt to taste.
  if [[ -n "$left" ]]; then
    # Append data to output string
    output="${output:+$output,}$left"
  fi
done <<< "$input"

echo "$output"

答案 2 :(得分:1)

使用sed

$ sed ':a;N;$!ba;s/|[0-9]*\n*/,/g;s/,$//' file
dsadadq-2321dsad-dasdas,dsadadq-2321dsad-d22as

或者,这里的sed tr更具可见性{/ 1}}。

$ sed 's/|.*$/,/g' file | tr -d '\n' | sed 's/,$//'
dsadadq-2321dsad-dasdas,dsadadq-2321dsad-d22as

答案 3 :(得分:0)

Choroba有最好的答案(imho),除了它不处理空行并添加一个尾随逗号。此外,与IFS混淆是不必要的。 这是对他解决这些问题的答案的修改:

while read line ; do
    if [ -n "$line" ]; then
        if [ -n "$afterfirst" ]; then echo -n ,; fi
        afterfirst=1
        echo -n "${line%|*}"
    fi
done < "$FILENAME"

第一个if只是过滤掉空白行。第二个if$afterfirst内容只是为了防止额外的逗号。除了第一个条目之外,它在每个条目之前回显一个逗号。 ${line%|\*}是一个bash参数表示法,如果它与某个表达式匹配,则删除参数的结尾。 line是参数,%是表示应删除尾随模式的符号,|*是要删除的模式。