シェル内の2つの出力のデカルト積

シェル内の2つの出力のデカルト積

与えられたファイルからファイル名と列を抽出するシェルスクリプトがあります。ディレクトリから読み取る必要があるサンプルファイルは次のとおりです。

2222_AAA Accounting Statistic-42005_04May2020_0900-04May2020_1000.csv


#!/bin/bash

# Go to where the files are located
filedir=/home/vikrant_singh_rana/AAA_USP/sample-Files/*

for filename in $filedir
do
 #echo "Processing $filepath"
 # do something on $f
 printf '%s,%s\n' "$(basename "$filename" ".csv" | grep -oP '(?<=_).*(?=\-\d\d\d)' )" "$(head -n1 "$filename")"

done > test.txt;

上記のシェルスクリプトは、次の出力を生成します。入力ファイルのファイル名とタイトル列

cat test.txt
AAA Accounting Statistic,TIMESTAMP,C420050004,C420050005,C420050006,C420050007

ファイル名とファイル列のデカルト積を期待します。

AAA Accounting Statistic,TIMESTAMP
AAA Accounting Statistic,C420050004
AAA Accounting Statistic,C420050005
AAA Accounting Statistic,C420050006
AAA Accounting Statistic,C420050007

答え1

最初の行を処理するには2番目のループが必要です。$filename

for filename in /home/vikrant_singh_rana/AAA_USP/sample-Files/*; do
    # ...
    b=$(basename "$filename" ".csv" | grep -oP '(?<=_).*(?=\-\d\d\d)' )
    for c in $(head -n1 "$filename" | sed 's/,/ /g'); do
        printf '%s,%s\n' "$b" "$c"
    done
done > test.txt

PS:最初の行に空白文字や改行文字がないとします$filename

答え2

#!/bin/sh

for pathname in /home/vikrant_singh_rana/AAA_USP/sample-Files/*.csv
do
    name=${pathname##*/}   # remove directory path
    name=${name#*_}        # remove *_ prefix (up to first underscore)
    name=${name%%-*}       # remove -* suffix (from first dash)

    awk -F , -v name="$name" 'BEGIN { OFS=FS } { for (i = 1; i <= NF; ++i) print name, $i; exit }' "$pathname"
done

これはすべてのCSVファイルを繰り返し、NNNN_名前からディレクトリパスと最初の文字列だけでなく、最初の文字-の後のすべてのエントリを削除します。文字列はに保存されます$name

awk次に、ファイルの最初の行にあるフィールドを別の行に印刷するショートプログラムを実行します。各行には、から抽出した値が前に付けられます$name

これはCSVファイルが次のようになると仮定します。シンプルフィールドの最初の行にカンマや改行が含まれていないCSVファイル。


何千ものファイルがない場合は、awk次のようにGNUを使用することもできます。

awk -F , '
    BEGIN { OFS=FS }
    BEGINFILE {
        name = FILENAME
        sub(".*/", "", name)       # remove directory path
        sub("^[^_]*_", "", name)   # remove *_ prefix (up to first underscore)
        sub("-.*", "", name)       # remove -* suffix (from first dash)
    }
    {
        for (i = 1; i <= NF; ++i) print name, $i
        nextfile
    }' /home/vikrant_singh_rana/AAA_USP/sample-Files/*.csv

関連情報