1

我正在尝试在 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

4 回答 4

1

不需要数组和sed

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

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

于 2012-11-07T15:28:11.317 回答
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"
于 2012-11-07T15:49:11.023 回答
1

使用sed

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

或者,这里有一点sed可读性tr

$ sed 's/|.*$/,/g' file | tr -d '\n' | sed 's/,$//'
dsadadq-2321dsad-dasdas,dsadadq-2321dsad-d22as
于 2012-11-07T16:02:48.443 回答
0

Choroba 有最好的答案(恕我直言),除了它不处理空行并且它添加了一个尾随逗号。此外,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是参数,%是指示应删除尾随模式的符号,是要删除|*的模式。

于 2012-11-07T16:41:48.697 回答