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

我做错了什么?

不是纯粹的 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

或者,这里有一个更具可读性的sedtr

$ 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是参数,%是指示应删除尾随模式的符号,|*是要删除的模式。

相关内容

  • 没有找到相关文章

最新更新