4

テキスト編集用のスクリプトを作成しようとしています。この場合、次のような text.csv という名前のテキスト ファイルがあります。

first;48548a;48954a,48594B
second;58757a;5875b
third;58756a;58576b;5867d;56894d;45864a

私はこのようにテキスト形式を作りたい:

first;48548a
first;48954a
first;48594B
second;58757a
second;5875b
third;58756a
third;58576b
third;5867d
third;56894d
third;45864a

これを実現するには、どのコマンドを使用すればよいですか?

4

4 に答える 4

6

私はこれをawkで行います。

;あなたの最初の行が:の代わりにあるべきであると仮定します,

$ awk -F\; '{for(n=2; n<=NF; n++) { printf("%s;%s\n",$1,$n); }}' input.txt

テストされていません。

于 2012-08-07T01:22:40.590 に答える
2

,これは、との両方を処理する純粋なbashソリューションです;

while IFS=';,' read -a data; do 
   id="${data[0]}"
   data=("${data[@]:1}")
   for item in "${data[@]}"; do 
      printf '%s;%s\n' "$id" "$item" 
   done
done < input.txt

更新-chepnerの提案に基づく代替印刷方法:

while IFS=';,' read -a data; do 
   id="${data[0]}"
   data=("${data[@]:1}")
   printf "$id;%s\n" "${data[@]}" 
done < input.txt
于 2012-08-07T01:26:48.923 に答える
1

awk -v FS=';' -v OFS=';' '{for (i = 2; i <= NF; ++i) { print $1, $i }}' 説明:awkは、データを暗黙的にレコードに分割し(デフォルトでは、改行で区切られます。つまり、line == record)、指定されたフィールドセパレーター(FS入力フィールドセパレーターとOFS出力セパレーター)によって番号付きフィールドに分割されます。このスクリプトは、レコードごとに、最初のフィールド(レコード名)とi番目のフィールドを出力します。これがまさに必要なものです。

于 2012-08-07T01:25:59.940 に答える
1
while IFS=';,' read -a data; do 
   id="${data[0]}"
   data=("${data[@]:1}")
   printf "$id;%s\n" "${data[@]}" 
done < input.txt

また

awk -v FS=';' -v OFS=';' '{for (i = 2; i <= NF; ++i) { print $1, $i }}'

$ awk -F\; '{for(n=2; n<=NF; n++) { printf("%s;%s\n",$1,$n); }}' input.txt

あなたの提案をありがとう、:d。それは本当に私に新しい知識を与えてくれます..

于 2012-08-07T04:18:22.737 に答える