質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
terminal

Terminalは、Apple社のmacOSに標準で付属しているUNIX端末エミュレータ。UNIXコマンドによってMacの操作および設定を行うことができます。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

UNIX

UNIXとは、AT&Tのベル研究所で開発されたコンピューター用のマルチユーザー・マルチタスクのオペレーションシステム(OS)です。政府や教育機関や研究所で広範囲に採用されています。

MacOS(OSX)

MacOSとは、Appleの開発していたGUI(グラフィカルユーザーインターフェース)を採用したオペレーションシステム(OS)です。Macintoshと共に、市場に出てGUIの普及に大きく貢献しました。

zsh

zshは、UNIX系OSのシェルの1つです。 cshやksn系のコマンドライン編集機能も実装されたシェルです。

Q&A

解決済

3回答

485閲覧

ターミナルでの文字列処理

Moyomoto-pixcel

総合スコア1

terminal

Terminalは、Apple社のmacOSに標準で付属しているUNIX端末エミュレータ。UNIXコマンドによってMacの操作および設定を行うことができます。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

UNIX

UNIXとは、AT&Tのベル研究所で開発されたコンピューター用のマルチユーザー・マルチタスクのオペレーションシステム(OS)です。政府や教育機関や研究所で広範囲に採用されています。

MacOS(OSX)

MacOSとは、Appleの開発していたGUI(グラフィカルユーザーインターフェース)を採用したオペレーションシステム(OS)です。Macintoshと共に、市場に出てGUIの普及に大きく貢献しました。

zsh

zshは、UNIX系OSのシェルの1つです。 cshやksn系のコマンドライン編集機能も実装されたシェルです。

0グッド

0クリップ

投稿2023/07/24 06:06

実現したいこと

awkでダブルクォーテーションとカンマで要素を区切って出力する
一番最後のカンマのみ削除する

前提

docker CentOS7
zshシェルで実行しています

出力

"root", "bin", "daemon", "adm", "lp", "sync", "shutdown", "halt", "mail", "operator", "games", "ftp", "nobody", "systemd-network", "dbus", "apache",

問題

一番最後のカンマのみ削除しようとしていますができませんでした。

該当のソースコード

zsh

1cat /etc/passwd | awk -F':' "BEGIN{ORS = \" \"}{print \"\\\"\" \$1 \"\\\",\"}END{print " "}"

試したこと

インターネット上の情報などをもとに END 変数を追加しましたが求める効果がありませんでした

補足情報(FW/ツールのバージョンなど)

M1MAC
docker desktop Ver 4.21.1
CentOS7
zsh

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

passwdファイル程度のサイズなら、都度出力せず、変数にセットする手もあります。

sh

1cat /etc/passwd | 2awk -F':' '{A=A ", \"" $1 "\""}END{print substr(A,3)}'

ギガバイト単位の保存は止めた方が良さそうですが。

投稿2023/07/24 10:43

otn

総合スコア84566

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

一旦出力してしまったものは消せないので、ENDでなんとかするのは無理だと思います。

発想を変えて、「最初の項だけカンマを出力せず、その後は前に出力したものの後にカンマを出力してから項を出力する」ということにします。「"root"」、「, "bin"」、「, "daemon"」、……のように出力するということです。

一行で書くと見辛すぎるので、ソースファイルの形にします。

awk

1BEGIN { 2 FS = ":" 3 ORS = "" 4} 5NR == 1 { 6 print "\"" $1 "\"" 7} 8NR != 1 { 9 print ", \"" $1 "\"" 10} 11END { 12 print "\n" 13}

FS = ... (行2) は-Fオプションを指定するのと同じことです。ORSは要りません (行3) が、一番最後は改行したほうがいいのではないでしょうか (行12)。

NRは入力から読み込んだレコード数、つまり何行目かを表します。1行目か (行5) それ以降か (行8) で出力するものを変えます。

ついでに実行方法について。

  • 上のソースコードをファイルに保存して

    zsh

    1cat /etc/passwd | awk -f ファイル名

    と実行する。

  • ソースコードを1行にして適宜エスケープしてコマンドライン上で実行する (質問者さんの方法)。

    zsh

    1cat /etc/passwd | awk "BEGIN{……中略……"
  • やや黒魔術っぽいですが、zshではヒアドキュメントを使う方法もあります。次のような内容のシェルスクリプトを作成して実行します。

    zsh

    1#!/bin/zsh 2 3cat /etc/passwd | awk -f <(cat - <<-'EOF' 4 BEGIN { 5 FS = ":" 6 ORS = "" 7 } 8 NR == 1 { 9 print "\"" $1 "\"" 10 } 11 NR != 1 { 12 print ", \"" $1 "\"" 13 } 14 END { 15 print "\n" 16 } 17EOF 18)

    他のシェル、たとえばbash、dash、kshなどでは動きませんので注意。詳しくは "Command/Process Substitution" を参照してください。

投稿2023/07/24 08:01

ikedas

総合スコア4337

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

zsh

1cat /etc/passwd | awk -F':' '{one = one (NR>1 ? "," : "") "\"" $1 "\""}END{print one}'

投稿2023/07/24 06:39

melian

総合スコア19818

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Moyomoto-pixcel

2023/07/24 07:00

解決しました! ありがとうございました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問