UNIXコマンドを使用して文字列を新しい行と一重引用符で並べ替える

UNIXコマンドを使用して文字列を新しい行と一重引用符で並べ替える

次のようなテキストがたくさんあります。

K1      CM1     TN1     CT14    D01
K2      CM2     TN2     CT15    D02
K3      CM3     TN3     CT16    D03
K4      CM4     TN4     CT17    D04
K5      CM5     TN5     CT18    D05
K6      CM6     TN6     CT19    D06
K7      CM11    TN7     CT20    D07
K8      CM12    TN8             D08
TW10    CM15    TN9             D09
TW11            TN10            D11
TW12            TN11            D12
TW16            TN12            D6W

(列は空にすることができ、空白ではなくタブで区切ることができます。 - cas)

BBeditのRun Unixコマンド機能を使用して、このテキストを次のように変換したいと思います。

'K1',
'K2',
'K3',
'K4',
'K5',
'K6',
'K7',
'K8',
'TW10',
'TW11',
'TW12',
'TW16',
'CM1',
'CM2',
'CM3',
'CM4',
'CM5',
'CM6',
'CM11',
'CM12',
'CM15',
'TN1',
'TN2',
'TN3',
'TN4',
'TN5',
'TN6',
'TN7',
'TN8',
'TN9',
'TN10',
'TN11',
'TN12',
'CT14',
'CT15',
'CT16',
'CT17',
'CT18',
'CT19',
'CT20',
'D01',
'D02',
'D03',
'D04',
'D05',
'D06',
'D07',
'D08',
'D09',
'D11',
'D12',
'D6W'

ご覧のとおり、各文字列は一重引用符で囲まれ、最後の文字列と区別され、その後にカンマが続きます。

よろしくお願いします。

ベストアンサー1

入力にタブ区切りのフィールドがある行があり、まず上から下に各行の最初のフィールドが必要で、2番目のフィールドなどが必要で、引用符とコンマが必要であると仮定すると、次のような安価なソリューションがあります。

最大9つの列を持つ2つの見苦しい行(sedを使用してフォーマットされています):

for i in 1 2 3 4 5 6 7 8 9; do cut -f$i file.txt; done | 
    grep -v '^$' | sed  -e "s/^/'/" -e "s/\$/'/" -e '$!s/$/,/'

AWKを使用した手動転置(最後のコンマを削除するためにsedを追加):

awk -F'\t' 'NF > cols {cols=NF}
                      {for (i=1; i<=NF; i++) { a[i,NR]=$i }} 
            END { for (j=1;j<=cols;j++) for (i=1;i<=NR;i++)
                      if (a[j, i] != "") printf "\047%s\047,\n", a[j, i] }' file.txt |
    sed -e '$s/,$//'

GNU datamashを使用(およびフォーマット用のsed):

datamash --no-strict transpose < file.txt | tr -s '\t' '\n' |
    sed -e "s/^/'/" -e "s/\$/'/" -e '$!s/$/,/'

(Linuxでテストされており、最初の2つはmacOSでも動作します)

おすすめ記事