我正试图在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
我做错了什么?
答案 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
是参数,%
是表示应删除尾随模式的符号,|*
是要删除的模式。