我正在尝试在 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
我做错了什么?
不是纯粹的 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|4212ndsadadq-2321dsad-d22as|4322n'
# 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"
不需要数组和sed
:
while IFS='' read line ; do
echo -n "${line%|*}",
done < "$FILENAME"
你只需要删除最后一个逗号:-)
使用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
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
是参数,%
是指示应删除尾随模式的符号,|*
是要删除的模式。