1

bashでファイルを1行ずつ読み込もうとしています。

各行のフォーマットは次のとおり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

純粋な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 に答える
1

配列と は必要ありませんsed:

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

最後のコンマを削除するだけです:-)

于 2012-11-07T15:28:11.317 に答える
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"

1つ目ifは、空白行を除外することです。2つ目は、余分なコンマを防ぐためだけifのものです。$afterfirst最初のエントリを除くすべてのエントリの前にコンマがエコーされます。 ${line%|\*}ある式に一致する場合にパラメーターの終わりを削除するbashパラメーター表記です。 lineはパラメータ、%は末尾のパターンを削除する必要があることを示す記号、は|*削除するパターンです。

于 2012-11-07T16:41:48.697 に答える